簡體   English   中英

Scala匿名函數語法和返回類型

[英]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: Intval 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.

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