在函数参数描述中使用它们时,它们具有不同的效果。 只有后一种形式才能接受多行操作,如
{
println(“hello”)
println(“world”)
1
}
但是,前者不能。
我知道'()'的意思是“没有参数”,对吧?但是'=> Int'是什么意思?
这是整个故事。
定义一个函数
def func(x: =>Int)= {
println(x)
}
调用它
func {
println("hello")
println("world")
1
}
我们会得到
hello
world
1
但是,如果我们将函数定义为
def func(x: ()=>Int)= {
println(x)
}
使用以前的代码调用它,我们将获得
error: type mismatch;
found : Int(1)
required: () => Int
1
^
那么,'x :()=>之间的区别是什么? Int'和'x:=> INT”?
答案 0 :(得分:2)
按名称评估VS高阶函数的呼叫行为
按名称评估评估:
如果按名称调用,则在调用函数之前计算表达式。
示例:强>
def func(x: =>Int): Int= {
x
}
func(10 + 2)
高阶函数:
在HOF的情况下,传递函数并在调用函数时计算其结果。
示例:强>
def func(x: () =>Int): () => Int = {
x
}
func(() => 10 + 2)
注意:检查返回类型是否更清晰。
答案 1 :(得分:0)
基本上,没有区别。两者都代表0-arity函数,导致Int值。
然而,它们的使用方式存在很大差异。一, x:=> Int ,用于方法中的call-by-name参数,只需引用Int即可调用。编译器完成剩下的工作。
另一种形式, x :()=> Int 用于您真正想要传递0-arity函数的方法参数。但是当你在方法中使用 x 时,你必须实际给它括起来。当然,当你调用方法时,你需要传入一个函数(或部分应用的方法),而不是一个Int。
以下是一个例子:
def and(a: Boolean, b: () => Boolean): Boolean = if (a) b() else false
def not(): Boolean = false
println(and(true, not))