如何在Scala中将类方法作为参数传递
假设我有一个C类和一些方法如何在Scala中将类方法作为参数传递,scala,Scala,假设我有一个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 } defcmp(第一个:C,第二个:C,t:()=>Int):布
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
}
defcmp(第一个:C,第二个:C,t:()=>Int):布尔={
第一.t<第二.t
}
这抱怨t不是C的一种方法。肯定有一种方法可以表达这一点
def cmp(first:C, second:C, t: C => Int): Boolean = {
t(first) < t(second)
}
这是使用匿名函数。最后两行相当于:
cmp(c1, c2, {c: C => c.f1()})
cmp(c1, c2, {c: C => c.f2()})
除非使用某种反射,否则无法传递对方法本身的引用。您可以只传递方法引用:
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"
}
}
对象操作扩展应用程序{
C类(val x:Int){
def f1():Int=x-1
def f2():Int=x+1
}
def cmp(第一个:()=>Int,第二个:()=>Int):布尔={
第一个()
}
覆盖def main(参数:数组[字符串]){
println(cmp(新的C(1.f1,新的C(0.f2))//打印“true”
println(cmp(新的C(1.f2,新的C(1.f1))//打印“false”
}
}
这些方法将在其相应的对象实例上关闭,因此净效果相当于您看起来想要完成的 这种方法也可能有效:
@ class myClass {
def double(x: Int): Int = x * 2
def triple(x: Int): Int = x * 3
}
defined class myClass
@ val instance = new myClass
instance: myClass = ammonite.$sess.cmd0$myClass@4195105b
@ def callArbitraryMethod(instance: myClass, f: (myClass, Int) => Int, x: Int): Int = f(instance, x)
defined function callArbitraryMethod
@ val f = (instance: myClass, x: Int) => instance.double(x)
f: (myClass, Int) => Int = ammonite.$sess.cmd3$$$Lambda$1965/11731022@3b8b4846
@ callArbitraryMethod(instance, f, 10)
res4: Int = 20
事实上,两个答案都很好-谢谢!但我接受了这个,因为它是我实际使用的。
@ class myClass {
def double(x: Int): Int = x * 2
def triple(x: Int): Int = x * 3
}
defined class myClass
@ val instance = new myClass
instance: myClass = ammonite.$sess.cmd0$myClass@4195105b
@ def callArbitraryMethod(instance: myClass, f: (myClass, Int) => Int, x: Int): Int = f(instance, x)
defined function callArbitraryMethod
@ val f = (instance: myClass, x: Int) => instance.double(x)
f: (myClass, Int) => Int = ammonite.$sess.cmd3$$$Lambda$1965/11731022@3b8b4846
@ callArbitraryMethod(instance, f, 10)
res4: Int = 20