我对在 Scala 中使用按名称调用的参数有点困惑。请帮助我了解这里发生了什么。考虑以下使用按名称调用参数的示例:
def param = {println("Param evaluates"); 40}
def lazyEval(x: => Int) = {
println("lazy");
x
}
val s = lazyEval(param + 2)
// s = 42
关于这个,我有几个彼此相关的问题:
lazyEval
方法需要 type 的参数=> Int
,那么为什么param + 2
操作是合法的?为什么我们可以在调用方法时将整数 2 添加到具有类型的对象=> Int
(我的理解是在底层) ?正如 IDE 提示我的那样,该函数需要类型参数而不是(到底是什么?)。<function0>
lazyEval
lazyEval
Int
=> Int
为什么将回调类型从更改
=> Int
为() => Int
代码后无法编译?这两种类型不同吗?我虽然简短版本('=> Int')只是一个语法糖。在玩了一些代码之后,我终于可以更改代码,以便它可以使用
() => Int
. 这种方式对我来说更直观。
.
def param = {println("Param evaluates"); 40}
def lazyEval(x: () => Int) = { // changed type to '() => Int'
println("lazy");
x() // explicitly calling function using parentheses '()'
}
val s = lazyEval(param _) // adding underscore after method name and removing `+2`
=> Int
这个版本和第一个版本(带有回调类型)有什么区别?为什么在这个版本中我们不能将整数与值2
和param
函数相加(我的意思是 this lazyEval(param _ + 2)
)?方法名称后的下划线是什么意思?(我猜它曾经传递方法本身,而不是返回值)
感谢帮助