Scala: как сохранить функцию в var?

Я изучаю Scala и пытаюсь сохранить функцию в var, чтобы оценить ее позже:

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

но это не компилируется:

ошибка: несоответствие типов;
найдено: Any
требуется: () => Any
action = act

Поэтому мне кажется, что в action = act вместо того, чтобы присваивать функцию, она оценивает ее и присваивает результат.
Я не могу понять, как присвоить функцию, не оценивая ее.

Спасибо!


person Damian    schedule 23.10.2009    source источник


Ответы (2)


Тип примечания "() => 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
person Walter Chang    schedule 23.10.2009

Я думаю, что ваше объявление параметра неверно. Это, вероятно, то, что вам нужно, если вы просто хотите сохранить функцию в var для последующего использования:

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

а потом:

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

scala> setAction(p)

scala> action()
hi!
res2: Any = ()
person Dave Ray    schedule 23.10.2009