[英]Scala anonymous function syntax and return type
我在scala中發現了幾種匿名函數語法:
val m5_1 = { (n: Int) => n * 5 }
val m5_2 = (n: Int) => { n * 5 } : Int
val m5_3: Int => Int = n => { n * 5 }
是否存在所有類型或更多語法類型?
它們都相同嗎?
哪一個更受/更不受歡迎?
如何在m5_1
指定返回類型?
我會嘗試添加到@pamu的答案:
哪一個更受/更不受歡迎?
我會說第二個變種有點不常見。 當類型推斷很容易被看到時,你可以去第一個,否則是明確的,因為在第三個案例中是好的。 你不需要括號,所以更簡單的變種是
val m5_3: Int => Int = n => n * 5
甚至
val m5_3: Int => Int = _ * 5
如何在m5_1中指定返回類型?
返回類型是Int => Int
,因此與第三種情況中使用的類型注釋相同:
val m5_1: Int => Int = { (n: Int) => n * 5 }
但當然,您可以讓Scala在右側使用類型推斷:
val m5_1: Int => Int = n => n * 5
因此,這與您的第三種形式相同。
請注意: Int
第二種形式的: Int
不定義m5_2
的類型,即Int => Int
而不是Int
。 它只是告訴Scala n * 5
的類型是Int
。 這可以幫助您閱讀代碼,但實際上並沒有改變在這種情況下推斷類型的方式。 你可以想到你的第二種形式:
val m5_2 = (n: Int) => {
val res = n * 5: Int // : Int redundant here because it is already inferred
res
}
其中val res = n * 5: Int
與val res: Int = n * 5
具有相同的效果val res: Int = n * 5
是否存在所有類型或更多語法類型?
Lambda語法要求輸入參數類型是已知的。 如果不是編譯器拋出錯誤。 在您嘗試提供此信息的所有語法中。 但是返回類型可以由編譯器推斷。
它們都相同嗎?
一切都是等價的
哪一個更受/更不受歡迎?
如果您不想查看顯式類型注釋,建議使用以下內容
val m5_1 = { (n: Int) => n * 5 }
如何在m5_1中指定返回類型?
返回類型是從lambda的最后一行推斷出來的。 最后一行是n * 5
,類型為Int。 因此,編譯器會為您推斷出類型。 您可以跳過顯式提供類型信息
好吧,上面的答案已經恰當地解釋了我猜的幾乎所有內容。 我只想添加一個我們可以在這里做的變體:
val m5_4 = {n=> n*5}:Int=>Int
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.