7

私はScalaを学んでおり、後で評価するために関数をvarに保存しようとしています:

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

しかし、それはコンパイルされません:

エラー: タイプが一致しません。
見つかった:
必要な: () => 任意
のアクション = 行為

action = actしたがって、関数を割り当てる代わりに、関数を評価して結果を割り当てるように思えます。
関数を評価せずに割り当てる方法がわかりません。

ありがとう!

4

2 に答える 2

15

タイプ "() => Any" は、名前によるパラメーター "=> Any" と同じではないことに注意してください。型 "() => 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
于 2009-10-23T03:42:58.637 に答える
2

パラメータ宣言が間違っていると思います。後で使用するために単純に関数を var に格納したい場合は、おそらくこれが必要です。

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

その後:

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

scala> setAction(p)

scala> action()
hi!
res2: Any = ()
于 2009-10-23T03:44:46.730 に答える