簡體   English   中英

Val和def的函數文字引用

[英]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

它在使用方面似乎幾乎相同。 我要么將v2f2傳遞給接受(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]AB任何實例都必須是具體類型)。 但是我們可以定義一個返回函數的多態方法,當我們編寫例如myIndentity(1)A將被推斷為Int ,我們將創建(並應用)一個Function[Int, Int]就像你一樣我期待。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM