Скала:Как «сохранить» функцию в переменной?
-
05-07-2019 - |
Вопрос
Я изучаю Scala и пытаюсь сохранить функцию в переменной var, чтобы оценить ее позже:
var action:() => Any = () => {}
def setAction(act: => Any) {
action = act
}
но это не компилируется:
ошибка:несоответствие типов;
найденный:Любой
необходимый:() => Любой
действие = действие
Так мне кажется, что в action = act
вместо назначения функции он оценивает ее и присваивает результат.
Я не могу понять, как назначить функцию, не оценивая ее.
Спасибо!
Решение
Тип примечания «() => Любой» не совпадает с поименным параметром «=> Любой».Тип «() => 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
Другие советы
Я думаю, что ваше объявление параметра неверно.Вероятно, это то, что вам нужно, если вы просто хотите сохранить функцию в переменной var для дальнейшего использования:
def setAction(act:() => Any) {
action = act
}
а потом:
scala> def p() { println("hi!") }
p: ()Unit
scala> setAction(p)
scala> action()
hi!
res2: Any = ()