Scala 从可变集合中删除函数

Scala 从可变集合中删除函数,scala,Scala,我想将对象的方法存储在可变集合中。我可以毫无问题地添加该方法,但无法删除它: scala> import scala.collection.mutable.Set import scala.collection.mutable.Set scala> class c { | def f(value: Double) { | println(value) | } | } defined class c scala> val o = new

我想将对象的方法存储在可变集合中。我可以毫无问题地添加该方法,但无法删除它:

scala> import scala.collection.mutable.Set
import scala.collection.mutable.Set

scala> class c {
     | def f(value: Double) {
     | println(value)
     | }
     | }
defined class c

scala> val o = new c
o: c = c@4b08e64d

scala> val s = Set.empty[Function1[Double, Unit]]
s: scala.collection.mutable.Set[Double => Unit] = Set()

scala> s add o.f
res0: Boolean = true

scala> s.size
res1: Int = 1

scala> s remove o.f
res2: Boolean = false

scala> s.size
res3: Int = 1
如果我创建一个集合来保存c类型的对象,那么一切都会按预期进行

scala> val s2 = Set.empty[c]
s2: scala.collection.mutable.Set[c] = Set()

scala> s2 add o
res4: Boolean = true

scala> s2.size
res5: Int = 1

scala> s2 remove o
res6: Boolean = true

scala> s2.size
res7: Int = 0

我想做的是可能的吗?

o.f
类似于函数指针,但实际上不是

scala> o.f _
res6: Double => Unit = <function1>

scala> res6.##
res7: Int = 1849765122

scala> o.f _
res8: Double => Unit = <function1>

scala> res8.##
res9: Int = 509798553
编辑:

忽略我的法语,不管怎样,这是镜子特有的,所以这不是一个进步

换句话说,使用java反射

scala> classOf[c].getMethod("f", classOf[Double])
res23: java.lang.reflect.Method = public void c.f(double)

scala> res23.##
res24: Int = 521628901

scala> classOf[c].getMethod("f", classOf[Double])
res25: java.lang.reflect.Method = public void c.f(double)

scala> res25.##
res26: Int = 521628901

换句话说,
valx=o.f;s加x;s移除x
@som snytt在第三段代码中,您不是在访问o的实例方法,而是在访问c的方法。是吗?@bwroga是的,它与res14相同,您可以创建一个func val来调用它(按原样对实例进行curry处理),但这对比较没有用处。我可以想象一个case类将一个方法和一个实例配对。你想要“…将一个对象的方法存储在…”中是完全不可能的。方法不是一级实体,不能视为值。但它们的第一类对应项功能可以。尽管如此,不利的一面是它们没有有意义的身份,也不容易进行平等性测试。因此,它们不能很好地用于收藏中的存储和检索。@RandallSchulz谢谢,这是有道理的。
scala> classOf[c].getMethod("f", classOf[Double])
res23: java.lang.reflect.Method = public void c.f(double)

scala> res23.##
res24: Int = 521628901

scala> classOf[c].getMethod("f", classOf[Double])
res25: java.lang.reflect.Method = public void c.f(double)

scala> res25.##
res26: Int = 521628901