2015-01-01 22 views
0

什麼是=>運營商的鏈接的意義就像這個代碼:在Scala的函數文字中,鏈接=>(向右雙箭頭)運算符的含義是什麼?

val a = Array("I", "love", "Scala Johnson") 
a.foreach { 
    x => y: String => println(x) 
} 

它打印出來罷了。

那麼發生了什麼? x彙編失敗了嗎?

如果我刪除從y參數String類型聲明:

x => y => println(x) 

"missing parameter type"編譯錯誤。

然後我做了一個實驗:

val hotFunc: Int => Int => Unit = x => y => println(x * y) 
hotFunc(2)(11) 

它打印出來22

那麼,=>的鏈接是否意味着咖喱?

UPDATE:

第三案:

def readFile[T](f: File)(handler: FileInputStream => T): T = { 
    val resource = new java.io.FileInputStream(f) 
    try { 
     handler(resource) 
    } finally { 
     resource.close() 
    } 
} 

val bs = new Array[Byte](4) 

readFile(new File("Slurp.scala")) { 
    input => b: Byte => println("Read: " + (input.read(bs) + b)) 
} 

這同樣與第1例,打印出來罷了。

回答

0

=>是正確的關聯,所以在你的第一個例子中,你正在呼籲與a的值,它會返回一個功能String=>Unit功能(但從來沒有被抓住,獲得隱式轉換爲Unit因爲foreach)。也許它會更清楚用括號:

x => ((y: String) => println(x)) 

其轉向

x => ((y: String) => println(x);()) 

foreach,因爲它需要T => Unit

鏈接=>(沒有括號)是一種咖啡,是的。

+0

謝謝,但我仍然有點困惑。請看第三個例子,那裏發生了什麼? – null

+0

@suud你還沒有調用返回的'Byte => Unit'函數,所以這也是第三個例子的預期行爲(我認爲它在你可以讀之前關閉了流,所以調用該函數很可能會導致' IOException')。 –

+1

好吧,我現在明白了。 'readFile'返回一個函數值('b:Byte => println(「Read:」+(input.read(bs)+ b)',類型爲Byte => Unit),它不執行函數值內部的代碼,這就是爲什麼沒有打印出來。 – null

相關問題