给定以下 Scala 代码:
val buffer = new scala.collection.mutable.ArrayBuffer[Function0[Boolean]]
def foo(): Boolean = { println("foo"); false }
def bar(): Boolean = { println("bar"); true }
buffer += foo
buffer += bar
我在缓冲区中添加了两个函数。现在,如何删除一个?
buffer -= foo
不起作用,因为 foo 在任何比较之前被评估为 bool 值。
最佳答案
您误解了当前代码不起作用的原因。以这种方式删除对象依赖于 ==
运算符,对于函数,该运算符仅使用对象标识来定义。这意味着如果要再次删除它,您必须确保要添加的函数具有 stable 值。您当前正在使用无法重新创建的匿名函数文字(方法引用中的“装箱”)。
换句话说,buffer += foo
等价于 buffer += (foo _)
,foo _
会给你一个每次都有不同的功能对象。试试这个:
buffer += foo
buffer += foo
buffer.map(System.identityHashCode(_))
res4: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(944601779, 1722981029)
糟糕,两个不同的对象,我们希望对同一个对象有两个引用。
现在试试
val fooRef:Function0[Boolean] = foo // or val fooRef = foo _
buffer += fooRef
buffer += fooRef
buffer.map(System.identityHashCode(_))
res8: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1732011089, 1732011089)
啊,这样更好! buffer -= fooRef
现在将按预期工作。
关于scala - 我在 Scala 列表中添加了一个函数,现在如何删除它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19062690/