您误解了当前代码不起作用的原因。以这种方式移除对象依赖于==
操作符,对于函数,它仅使用对象标识来定义。这意味着如果要再次删除它,您必须确保要添加的函数具有稳定的值。您当前正在使用无法重新创建的匿名函数文字(来自方法引用的“装箱”)。
换句话说,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
现在将按预期工作。