Scala:没有参数的函数

Asr*_*rar 0 lambda scala

我对 Scala 函数比较陌生,我对这种语法糖的实际工作方式以及何时使用特定类型感到困惑。

我已经编写了 3 个函数,它们都应该做同样的事情,但是我在理解为什么 Function0 的行为不同时遇到了问题

版本 1

val fn1 : (String) => String = System.getProperty(_)

println(fn1("os.name"));
Run Code Online (Sandbox Code Playgroud)

版本 2

  val fn2 : () => String = System.getProperty("os.name")

  println(fn2());
Run Code Online (Sandbox Code Playgroud)

版本 2 给出了类型不匹配;找到:所需的字符串:() ? 细绳

版本 3

val fn3 = () => System.getProperty("os.name")

println(fn3());
Run Code Online (Sandbox Code Playgroud)

我知道对于版本 2 scala 已经知道 System.getProperty 的返回类型,但是为什么它会产生那个特定的错误,为什么它会阻止我明确说明返回类型。我个人更喜欢显式返回类型,所以我不必深入研究一个方法来查看它返回的内容。

man*_*lds 5

在 中val fn2 : () => String = System.getProperty("os.name")System.getProperty("os.name")将被执行并返回一个字符串值。但是你说的fn2是一个值,它是一个不带参数并返回一个字符串的函数。

当您执行 时System.getProperty(_),就像执行x => System.getProperty(x),它是一个接受字符串并返回字符串的函数。这就是为什么第一个版本有效。