7

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

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

但这不会编译:

错误:类型不匹配;
找到:任何
必需的:() => 任何
操作 = 行动

所以在我看来,action = act不是分配函数,而是评估它并分配结果。
我不知道如何在不评估它的情况下分配函数。

谢谢!

4

2 回答 2

15

注意类型“() => Any”与按名称参数“=> Any”不同。类型“() => Any”是一个不带参数并返回 Any 的函数,而名称参数“=> Any”会延迟参数的执行,直到它被使用并返回 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
于 2009-10-23T03:42:58.637 回答
2

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

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

进而:

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

scala> setAction(p)

scala> action()
hi!
res2: Any = ()
于 2009-10-23T03:44:46.730 回答