質問

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 = ()
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top