如何在没有括号的情况下调用no-arg匿名函数

时间:2014-06-11 17:00:57

标签: scala

拿这段代码:

var x = 10
val y = () => x + 1

然后我想把y看作是一个包含Int的变量,并随时改变x的变化。基本上我想将y绑定到x。

问题是,如果我只输入y,那么我会得到结果res0: () => Int = <function0> 我的印象是你可以在没有任何问题的情况下调用0-arity函数,但是我需要使用y()来获得我想要实现的行为。

有没有更好的方法来定义匿名函数,还是需要使用不同的方法?

2 个答案:

答案 0 :(得分:2)

为什么你需要那样做?只需def y = x + 1

scala> var x = 1
x: Int = 1

scala> def y = x + 1
y: Int

scala> y
res0: Int = 2

scala> x = 3
x: Int = 3

scala> y
res1: Int = 4

编辑以解决一些意见:

如果定义val y = () => x + 1,则将y定义为一个值,该值保存不带参数的函数并返回Int。要调用此变量持有的函数,您需要使用()调用它,告诉编译器您不想传递值,而是执行(计算)其中的函数

如果定义val y = x + 1,则定义一个值(常量),在执行时分配,您可以使用延迟推迟评估,但一旦分配,它将不再被评估

如果定义def y = x + 1,则定义一个返回x + 1的函数,这就是你想要的。

答案 1 :(得分:1)

您尚未定义0-arity功能。您实际上已经定义了Unit => Int函数。这就是为什么你不能像调用它一样调用它。我很少见到包含函数范围的上下文之外的0-arity函数:

def something[V](value: Int)(f: => V) = 
  if(value %2 == 0) f 
  else throw new Exception("not even (and also not evaluated f)")

用作延迟执行的延迟执行体。

修改:我会使用其他人的答案。