2009-10-23 16 views
7

私はスカラ座を学んだし、私は後でそれを評価するために、VARに機能を保存しようとしています:Scala:関数をvarに "格納する"方法は?

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

それがコンパイルされません:

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

をだから、それは私には思えますaction = actでは、関数を代入するのではなく、それを評価して結果を代入します。
評価なしで関数を割り当てる方法を見つけることができません。

ありがとうございます!

答えて

15

注記 "()=> Any型は、by-nameパラメータ" => Any "と同じではありません。型( ")=>" Any "はパラメータを取らずAnyを返す関数ですが、by-nameパラメータ" => 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 
+0

おかげウォルター、それはもう少し理解するために私をたくさん助けたあなたは、単に後で使用するためにVarの機能を格納したい場合、これは何をしたい、おそらくですスカラ – Damian

2

だから、あなたがここで何をする必要があるか、以下です。その後、

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

と::

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

scala> setAction(p) 

scala> action() 
hi! 
res2: Any =() 
関連する問題