Скала:Как «сохранить» функцию в переменной?

StackOverflow https://stackoverflow.com/questions/1611203

  •  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 = ()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top