【问题标题】:What’s the difference between ‘x: () => Int’ and ‘x: => Int’‘x: () => Int’ 和 ‘x: => Int’ 有什么区别
【发布时间】:2018-06-17 10:15:53
【问题描述】:

在函数参数描述中使用这些时,它们具有不同的效果。 只有后一种形式可以接受像

这样的多行操作
{
  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’有什么区别?

【问题讨论】:

  • => 用于标识输入和输出类型。左边的类型是输入类型,右边的类型是函数的输出类型。您显示的语法不正确。您能否澄清您的问题或发布一些代码?

标签: scala


【解决方案1】:

名称评估与高阶函数的调用行为

按名称评估调用:

在按名称调用的情况下,在调用函数之前计算表达式。

示例:

def func(x: =>Int): Int= {
  x
}

func(10 + 2)

高阶函数:

在 HOF 的情况下,函数被传递并在函数被调用时计算其结果。

示例:

def func(x: () =>Int): () => Int = {
  x
}
func(() => 10 + 2)

注意:请检查返回类型以获得更清晰的信息。

【讨论】:

  • “在运行时评估”应该是“在调用函数之前评估”。所有表达式(类型和宏之外的)都“在运行时求值”。
【解决方案2】:

基本上没有区别。两者都表示产生 Int 值的 0-arity 函数。

但是,它们的使用方式存在很大差异。一,x: => Int,用于方法中的按名称调用参数,只需通过引用 Int 来调用。编译器完成其余的工作。

另一种形式,x: () => Int,用于您真正想要传入 0 元函数的方法参数。但是当你在你的方法中使用 x 时,你实际上必须给它加上括号。当然,当你调用方法时,你需要传入一个函数(或部分应用的方法),而不是一个 Int。

这是一个例子:

def and(a: Boolean, b: () => Boolean): Boolean = if (a) b() else false

def not(): Boolean = false

println(and(true, not))

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2021-06-21
    相关资源
    最近更新 更多