Scala:“保存”変数内の関数?
-
05-07-2019 - |
質問
Scalaを学習していますが、後で評価するために関数をvarに保存しようとしています:
var action:() => Any = () => {}
def setAction(act: => Any) {
action = act
}
しかし、コンパイルされません:
エラー:タイプの不一致;
見つかった:任意
必須:()=>任意
action = act
だから、 action = act
では、関数を割り当てるのではなく、関数を評価して結果を割り当てるように思えます。
評価せずに関数を割り当てる方法がわかりません。
ありがとう!
解決
メモの種類"()=> Any" by-nameパラメータ" =>とは異なります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
他のヒント
パラメータの宣言が間違っていると思います。これはおそらく、後で使用するために変数に関数を保存する場合に必要なものです。
def setAction(act:() => Any) {
action = act
}
そして:
scala> def p() { println("hi!") }
p: ()Unit
scala> setAction(p)
scala> action()
hi!
res2: Any = ()
所属していません StackOverflow