拿这段代码:
var x = 10
val y = () => x + 1
然后我想把y看作是一个包含Int的变量,并随时改变x的变化。基本上我想将y绑定到x。
问题是,如果我只输入y
,那么我会得到结果res0: () => Int = <function0>
我的印象是你可以在没有任何问题的情况下调用0-arity函数,但是我需要使用y()
来获得我想要实现的行为。
有没有更好的方法来定义匿名函数,还是需要使用不同的方法?
答案 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)")
用作延迟执行的延迟执行体。
修改:我会使用其他人的答案。