将函数作为参数传递给类构造函数时如何避免闭包?
我的类构造函数接受一个类型的函数() => 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())
Run Code Online (Sandbox Code Playgroud)
然后,当奇妙的物体触发它的触发器时,我得到的错误是没有像"Hershy"那样的键.我的结论是,显然,这是由于在没有"Hershy"的状态下f
传递给Trigger
cons被关闭.
我现在的问题是 - 如何避免Scala在这里使用闭包而是看看实际的状态cats
?
更新:
"当期间通过"的代码是这样的:
def update(tpf: Float) {
timePassed += tpf
if(timePassed > period) f()
}
Run Code Online (Sandbox Code Playgroud)
该tpf
值来自上面,所以在这里这一切似乎确定.
更新:
我发现问题出在另一个完全无关的地方,我把所有这些东西的容器弄糊涂了.然而,谢谢大家,我从答案中学到了一些东西.
闭包没有这样的东西(这将很难指定,具有可怕的性能,并使整个事情无用).封闭可能包含对猫的引用,或包含猫的实例,而不是副本.
此代码按预期工作:
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
Run Code Online (Sandbox Code Playgroud)
封闭没有错,我怀疑这是你的样本中没有出现的东西.
归档时间: |
|
查看次数: |
309 次 |
最近记录: |