0

関数をパラメーターとしてクラスコンストラクターに渡すときにクロージャを回避するにはどうすればよいですか?

私のクラス コンストラクターは type の関数を受け入れます() => Unit。プログラムの作業プロセス中に、コンストラクターでオブジェクトを作成した時点では定義されていなかった可変マップからキーと値のペアにアクセスしたい

val cats = scala.collection.mutable.Map[String, Cat]

class Trigger(period: Long, f: () => Unit) {

  //pseudocode:
  when period passes, f()

}

someWonderfulObject += new Trigger (1000, () => cats("Hershy").meow)

cats += ("Hershy" -> Cat())

そして、すばらしいオブジェクトがトリガーをトリガーすると、「Hershy」のようなキーがないというエラーが表示されます。どうやらこれは、"Hershy" がなかった状態でf、 cons に渡された状態で閉じられたためであると結論付けています。Trigger

私の質問は今です - Scala がここでクロージャーを利用するのを避け、代わりに ? の実際の状態を調べる方法はcats?

アップデート:

「期間が経過したとき」のコードは次のとおりです。

def update(tpf: Float) {
  timePassed += tpf
  if(timePassed > period) f()
}

値は上から取得されるtpfため、ここではすべて問題ないようです。

アップデート:

私は問題が別のまったく無関係な場所にあることを発見しました。私はこれらすべてのもののコンテナを混乱させました. しかし、皆さんありがとうございます。回答から何かを学びました。

4

1 に答える 1

6

クロージャーはそのようなことはしません (それを指定するのは非常に難しく、パフォーマンスが悪く、全体が役に立たなくなります)。クロージャーには、コピーではなく、猫への参照、または猫を含むインスタンスへの参照が含まれる場合があります。

このコードは期待どおりに動作します:

val cats = collection.mutable.Map[String, String]()

class Trigger(name: String, f: () => Unit) {
  def fire = {
    println("Fire " + name)
    f()
  }
}

val trigger = new Trigger("calling Hershy", () => println(cats("Hershy")))
cats += "Hershy" -> "meow"
trigger.fire // prints Fire calling Hershy

クロージャーに問題はありません。これはサンプルには表示されないものだと思います。

于 2012-04-18T11:01:50.377 に答える