我正在学习Scala,我正在尝试将函数存储在var中以便稍后对其进行评估:

var action:() => Any = () => {}
def setAction(act: => Any) {
    action = act 
}

但是没有编译:

  

错误:类型不匹配;
  发现:任何
  必需:()=>任何结果   action = act

所以在我看来,在 action = act 而不是分配函数时,它正在评估它并分配结果。
我无法在不进行评估的情况下找出如何分配函数。

谢谢!

有帮助吗?

解决方案

注意类型"()=>任何"与名称参数“=>不同任何&QUOT ;.输入“()=>任何"是一个不带参数并返回Any的函数,而by-name参数“=>任何"延迟执行参数直到它被使用并返回Any。

所以你需要做的是以下内容:

var action: () => Any = null

def setAction(act: => Any) = action = () => act

setAction(println("hello")) // does not print anything

action() // prints "hello"

setAction(123)

action() // returns 123

其他提示

我认为你的参数声明是错误的。如果您只是想在var中存储函数以供以后使用,那么这可能是您想要的:

def setAction(act:() => Any) {
    action = act 
}

然后:

scala> def p() { println("hi!") }
p: ()Unit

scala> setAction(p)

scala> action()
hi!
res2: Any = ()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top