假设我有一个带有一些方法的C类
def class C {
def f1():Int = ...
def f2():Int = ...
}
现在我想要一个带有两个C实例的方法,以及一个C方法,但我不知道f1,f2的类型是什么,也不知道如何调用它们。我认为它看起来像
def cmp(first:C, second:C, t:() => Int): Boolean = {
first.t < second.t
}
这抱怨说t不是C的方法。当然必须有办法表达这一点。
答案 0 :(得分:12)
def cmp(first:C, second:C, t: C => Int): Boolean = {
t(first) < t(second)
}
则...
val c1 = new C
val c2 = new C
cmp(c1, c2, _.f1())
cmp(c1, c2, _.f2())
这是使用匿名函数。最后两行相当于:
cmp(c1, c2, {c: C => c.f1()})
cmp(c1, c2, {c: C => c.f2()})
除非您使用某种反射,否则您无法将引用传递给方法。
答案 1 :(得分:9)
您只需传递方法引用:
object DoOperation extends App {
class C(val x: Int) {
def f1():Int = x-1
def f2():Int = x+1
}
def cmp(first: () => Int, second: () => Int): Boolean = {
first() < second()
}
override def main(args: Array[String]) {
println(cmp(new C(1).f1,new C(0).f2)) //prints "true"
println(cmp(new C(1).f2,new C(1).f1)) //prints "false"
}
}
方法将在相应的对象实例上关闭,因此净效果等同于您想要完成的效果。
答案 2 :(得分:0)
这种方法也可行:
this.panel2.nativeElement