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