鍍金池/ 教程/ Scala/ 函數(shù)–部分應(yīng)用的函數(shù)
包對象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達(dá)式
類和對象 (三)
操作基本數(shù)據(jù)類型
for 表達(dá)式
組合和繼承–重載成員函數(shù)和方法
類和對象 (二)
組合和繼承–定義 factory 對象
組合和繼承–多態(tài)和動(dòng)態(tài)綁定
Trait 的基本概念
if 表達(dá)式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問控制修飾符
Trait 示例–Rectangular 對象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無參數(shù)方法
類和對象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實(shí)現(xiàn)方法
try 表達(dá)式處理異常
選擇瘦接口還是胖接口設(shè)計(jì)?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進(jìn)一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實(shí)現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對象 (四)
函數(shù)–尾遞歸
沒有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴(kuò)展類
函數(shù)–部分應(yīng)用的函數(shù)
開始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來實(shí)現(xiàn)可疊加的修改操作

函數(shù)–部分應(yīng)用的函數(shù)

前面例子中我們使用“_” 來代替單個(gè)的參數(shù),實(shí)際上你也可以使用“_”來代替整個(gè)參數(shù)列表,比如說,你可以使用 print 來代替 println ().someNumbers.foreach(println _)。

Scala 編譯器自動(dòng)將上面代碼解釋成:

someNumbers.foreach( x => println (x))

因此這里的“_” 代表了 Println 的整個(gè)參數(shù)列表,而不僅僅替代單個(gè)參數(shù)。當(dāng)你采用這種方法使用“_”,你就創(chuàng)建了一個(gè)部分應(yīng)用的函數(shù)(partially applied function)。 在 Scala 中,當(dāng)你調(diào)用函數(shù),傳入所需參數(shù),你就把函數(shù)“應(yīng)用”到參數(shù)。 比如:一個(gè)加法函數(shù)。

scala> def sum = (_:Int) + (_ :Int) + (_ :Int)
sum: (Int, Int, Int) => Int
scala> sum (1,2,3)
res0: Int = 6

一個(gè)部分應(yīng)用的函數(shù)指的是你在調(diào)用函數(shù)時(shí),不指定函數(shù)所需的所有參數(shù),這樣你就創(chuàng)建了一個(gè)新的函數(shù),這個(gè)新的函數(shù)就稱為原始函數(shù)的部分應(yīng)用函數(shù),比如說我們固定 sum 的第一和第三個(gè)參數(shù),定義如下的部分應(yīng)用函數(shù):

scala> val b = sum ( 1 , _ :Int, 3)
b: Int => Int = <function1>
scala> b(2)
res1: Int = 6

變量 b 的類型為一函數(shù),具體類型為 Function1(帶一個(gè)參數(shù)的函數(shù)),它是由 sum 應(yīng)用了第一個(gè)和第三個(gè)參數(shù),構(gòu)成的。調(diào)用b(2),實(shí)際上調(diào)用 sum (1,2,3)。

再比如我們定義一個(gè)新的部分應(yīng)用函數(shù),只固定中間參數(shù):

scala> val c = sum (_:Int, 2, _:Int)
c: (Int, Int) => Int = <function2>
scala> c(1,3)
res2: Int = 6

變量 c 的類型為 Function2,調(diào)用 c(1,3) 實(shí)際上也是調(diào)用 sum (1,2,3)。

在 Scala 中,如果你定義一個(gè)部分應(yīng)用函數(shù)并且能省去所有參數(shù),比如 println ,你也可以省掉“”本身,比如:

someNumbers.foreach(println _)

可以寫成:

someNumbers.foreach(println)