Art*_*all 3 scala first-class-functions
给出以下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
Run Code Online (Sandbox Code Playgroud)
我已经为缓冲区添加了两个函数.现在,我该如何删除一个?
buffer -= foo 不起作用,因为foo在任何比较之前被计算为布尔值.
您误解了当前代码无法正常工作的原因.以这种方式删除对象依赖于==运算符,该函数仅使用对象标识定义函数.这意味着如果要再次删除它,必须确保要添加的函数具有稳定值.您当前正在使用匿名函数文字(来自方法引用的"盒装"),无法重新创建.
换句话说,buffer += foo相当于buffer += (foo _),foo _每次都会给你一个不同的功能对象.试试这个:
buffer += foo
buffer += foo
buffer.map(System.identityHashCode(_))
res4: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(944601779, 1722981029)
Run Code Online (Sandbox Code Playgroud)
哎呀,两个不同的对象,我们期望有两个引用相同的对象.
现在试试
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)
Run Code Online (Sandbox Code Playgroud)
啊,那更好!buffer -= fooRef现在将按预期工作.