scala - 我在 Scala 列表中添加了一个函数,现在如何删除它?

标签 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

我在缓冲区中添加了两个函数。现在,如何删除一个?

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/

相关文章:

oop - 从一等函数访问类成员

scheme - 如何将函数复制到新符号?

Java 8 围绕功能作为一等公民跳舞?

javascript - 如何在 JavaScript 中实现柯里化(Currying)?

Scala Try 的 toOption 方法返回 Some(null)

scala - 在 Scala 中将一个对象定义为对另外两个对象的操作

scala - 具有不同 bin 大小的 JFreeChart 直方图

Scala Play WebSocket - 一个 Actor,多种消息类型

scala - 使用 scalamock 在 scala 中使用 ClassTag 的模拟方法

作为一流函数的 Ruby 匿名类