2009-12-10 70 views
1

我有這樣的方法:定義Scala匿名函數時可以使用塊嗎?

def myMethod(value:File,x: (a:File) => Unit) = { 
    // Some processing here 
    // More processing 
    x(value) 
} 

我知道我可以把這個作爲:

myMethod(new File("c:/"),(x:File) => println(x)) 

是否有使用大括號的方式,我可以打電話了嗎?喜歡的東西:

myMethod(new File("c:/"),{ (x:File) => 
    if(x.toString.endsWith(".txt")) { 
     println x 
    } 
}) 

還是我必須寫在另一種方法,並傳遞到myMethod

回答

7

函數的主體部分可以是嵌段括在括號:

myMethod(new File("c:/"), x => { 
    if (x.toString.endsWith(".txt")) { 
    println(x) 
    } 
}) 

另一種方法是一種定義myMethod的作爲咖喱功能:

def myMethod(value: File)(x: File => Unit) = x(value) 

現在可以寫出這樣的代碼如下:

myMethod(new File("c:/")) { x => 
    if (x.toString.endsWith(".txt")) { 
    println(x) 
    } 
} 
+0

運行第一個代碼片段時,出現以下錯誤:「(片段w.scala):23:錯誤:值x不是單元的成員」在行「println x」 – Geo

+0

「println x」should println (x) – faran

+0

謝謝!這工作!你能告訴我如何指定'x'的類型嗎? – Geo

2

你給的例子實際上是有效的,如果你改正了缺乏在println xx附近進行合成。只需放上括號,你的代碼就可以工作。

所以,現在,您可能想知道什麼時候需要括號,何時不需要。幸運的是,其他人詢問that very question

相關問題