2009-10-23 10 views
7

uczę Scala i próbuję zapisać funkcję w var aby go ocenić później:Scala: Jak "przechowywać" funkcję w var?

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

ale nie kompilacji:

error: type mismatch;
found: Any
required:() => Any
action = act

Więc wydaje mi się, że w action = act zamiast przypisywać funkcję, to ją ocenia i przypisuje wynik.
Nie mogę dowiedzieć się, jak przypisać funkcję bez jej oceny.

Dzięki!

Odpowiedz

15

Typ notatki "() => Dowolny" nie jest tym samym, co parametr nazwy "=> Dowolny". Typ "() => Dowolny" jest funkcją, która nie przyjmuje żadnego parametru i zwraca Dowolny, podczas gdy parametr "=" Dowolnie "opóźnia wykonanie parametru, dopóki nie zostanie użyty i zwróci Dowolny.

Więc co trzeba zrobić tutaj jest następujący:

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 
+0

Dzięki Walter, to bardzo mi pomogło zrozumieć trochę więcej scala – Damian

2

myślę, że jesteś parametr deklaracja jest źle. To jest chyba to, co chcesz, jeśli po prostu chcesz zapisać funkcję w var do późniejszego użytku:

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

, a następnie:

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

scala> setAction(p) 

scala> action() 
hi! 
res2: Any =() 
Powiązane problemy