我对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的返回类型,但为什么会产生该特定错误,为什么它会阻止我明确说明返回类型。我个人更喜欢显式的返回类型,所以我不必深入研究它返回的方法。
答案 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)