繁体   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