Scala:没有参数的函数

时间:2016-11-03 12:55:47

标签: scala lambda

我对scala函数比较新,我对这种语法糖的实际工作原理以及何时使用特定类型感到困惑。

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

版本1

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

println(fn1("os.name"));

第2版

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

  println(fn2());

版本2给出了类型不匹配; found:需要字符串:()⇒字符串

第3版

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

println(fn3());

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

此版本将进行类型检查:

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

在这里呼叫fn2()就像呼叫:

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

在你的fn1示例中,下划线提供了这种隐式语法,它看起来更像是空args案例所需的内容:

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