Scala: Как да съхраня функция в var?

Уча Scala и се опитвам да запазя функция във var, за да я оценя по-късно:

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

но това не се компилира:

грешка: несъответствие на типа;
намерено: Всяко
изисква се: () => Всяко
действие = действие

Така че ми се струва, че в action = act вместо да присвои функцията, тя я оценява и присвоява резултата.
Не мога да намеря как да присвоя функцията, без да я оценявам.

Благодаря!


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


Отговори (2)


Типът бележка "() => Всеки" не е същият като параметъра по име "=> Всеки". Типът "() => 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