[英]Function Literal referencing by val and def
我試圖理解這兩種引用/定義Function Literal
(引用anonymous function
)的方法之間的關鍵區別:
由val
scala> val v2 = new Function[Int, Int] {
| def apply(a: Int): Int = a + 1
| }
v2: Int => Int = <function1>
並通過def
scala> def f2 = new Function[Int, Int] {
| def apply(a: Int): Int = a + 1
| }
f2: Int => Int
它在使用方面似乎幾乎相同。 我要么將v2
或f2
傳遞給接受(Int) => Int
作為參數的函數。 將參數傳遞給它..
我想還是V2它創建了一個的情況下Function1
是指對象Function1
對象..喜歡一個proxy
?
好的..我的問題是: 第1和第2種方法的優點和缺點是什么?
它由def
定義,它仍然是Function Literal
嗎?
首先,你的例子都不是實際的函數文字 - 你以簡單的無糖方式創建一個Function
實例,實際上你可以使用這種方法( new Function { ... }
)來創建一個實例來自Java代碼的scala.Function
。
以下是函數文字,並且與您的定義完全等效:
val v2 = (a: Int) => a + 1
def f2 = (a: Int) => a + 1
這里唯一真正的區別是val
將一勞永逸地創建一個實例,無論你使用v2
多少次(即使你從不使用它), def
也會每次創建一個新實例(或者不是根本,如果你從來沒有使用它)。 所以你通常想要一個val
。
但是,有些情況下您需要使用def
。 考慮以下:
def myIdentity[A] = (a: A) => a
我們無法將其寫為val
,因為Scala在這個意義上沒有多態函數(對於Function[A, B]
, A
和B
任何實例都必須是具體類型)。 但是我們可以定義一個返回函數的多態方法,當我們編寫例如myIndentity(1)
, A
將被推斷為Int
,我們將創建(並應用)一個Function[Int, Int]
就像你一樣我期待。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.