'x :()=>之间有什么区别? Int'和'x:=> INT”

时间:2018-06-16 02:53:28

标签: scala

在函数参数描述中使用它们时,它们具有不同的效果。 只有后一种形式才能接受多行操作,如

{
  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”?

2 个答案:

答案 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))