def foo(x: Int, f: Unit => Int) = println(f())
foo(2, { Unit => 3 + 4 })
// case 1
def loop: Int = 7
foo(2, loop) // does not compile
changing loop to
// case 2
def loop(): Int = 7
foo(2, loop) // does not compile
changing loop to
// case 3
def loop(x: Unit): Int = 7 // changing according to Don's Comments
foo(2, loop) // compiles and works fine
不应该
case 1
和 case 2
也工作?为什么他们不工作?将 foo 定义为
def foo(x: Int, y: () => Int)
然后
case 2
有效但无效 case 1
.他们不是都应该工作吗,以任何一种方式定义功能?
我也觉得
() => Int
in foo 是一种糟糕的风格,y:=> Int
不起作用。注释?
最佳答案
Scala 区分以下几点:
这些都不是等价的,尽管为方便起见,Scala 允许您省略空参数列表。 (顺便说一下,两个空参数列表也不一样。)
所以,即使
Unit
写的是 ()
, 这与函数参数括号 ()
不同用于函数或方法。相反,想想 ()
作为 Tuple0
.所以,如果你说
f: Unit => Int
,你的意思是“f 采用一个参数,但它是一个非常无聊的参数,因为它是 Unit
,它必须始终是相同的无聊 Tuple0
值 ()
”。你写的东西真的很短f: (Unit) => Int
.如果你说
f: () => Int
,那么您的意思是“f 不接受任何参数并产生 Int
”。如果你说
f: => Int
,那么您的意思是“延迟执行任何语句会产生 Int
值,直到我们在此代码中使用它(并每次重新评估它)”。在功能上,这最终与 f: () => Int
基本相同(并且在内部转换为相同的 Function0
类),但它有不同的用法,大概是为了允许更紧凑的闭包形式(您总是在调用代码中省略 =>
)。
关于scala - 不带参数的函数,以单位作为 Scala 中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2774516/