Scala - 如何避免关闭?

时间:2012-04-18 10:39:49

标签: scala closures

如何在将函数作为参数传递给类构造函数时避免闭包?

我的类构造函数接受类型为() => 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”这样的键。我的结论是,显然,这是由于传递给f缺点的Trigger在没有“Hershy”的状态下被关闭。

我现在的问题是 - 如何避免Scala在这里使用闭包,而是查看cats的实际状态?

更新

“期间过去时”的代码是:

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

tpf值来自上方,所以这一切似乎都没问题。

更新

我发现问题出现在另一个完全无关的地方,我把所有这些东西的容器弄糊涂了。然而,谢谢大家,我从答案中学到了一些东西。

1 个答案:

答案 0 :(得分: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

关闭没有错,我怀疑这是你的样本中没有出现的东西。