相关:How do you assign a function to a value in Scala?
鉴于:
class Foo{
def bar = println("bar")
def bat = println("bat")
}
如何创建fnRef
,使其指向Foo.bar
或Foo.bat
?
def deepFunction(foos : List[Foo], fnRef : ()=>Unit) = {
foos.map(_.fnRef) //May call either bar or bat
}
额外奖励:是否可以约束fnRef,使其成为Foo类中该签名的唯一方法?
答案 0 :(得分:6)
你没有。 :-)而是用一流函数编写代码。 Scala的优点在于它将创建_.method
的函数文字,其类型为T => R
,其中T
是参数的类型,而R
是方法的返回类型。
因此,_.bar
和_.bat
都会Foo => Unit
:
scala> class Foo{
| def bar = println("bar")
| def bat = println("bat")
| }
defined class Foo
scala> def deepFunction(foos: List[Foo], fn: Foo => Unit) {
| foos.map(fn)
| }
deepFunction: (foos: List[Foo], fn: Foo => Unit)Unit
scala> deepFunction(List(new Foo, new Foo), _.bar)
bar
bar
scala> deepFunction(List(new Foo, new Foo), _.bat)
bat
bat
这种方法的真正好处在于你可以使用你想要的任何功能,而不仅仅是成员函数。
scala> def bam(f: Foo) { println("bam") }
bam: (f: Foo)Unit
scala> deepFunction(List(new Foo, new Foo), bam)
bam
bam
答案 1 :(得分:2)
您可以通过部分应用程序获取对方法的引用:
scala> val foo = new Foo
foo: Foo = Foo@5dc22e67
scala> val fun = foo.bar _
fun: () => Unit = <function0>
scala> fun()
bar
这也适用于多个参数列表:
scala> class Bar { def bar(s: String, t: String) = println(s+t) }
defined class Bar
scala> new Bar().bar _
res0: (String, String) => Unit = <function2>
答案 2 :(得分:1)
方法不是Scala中的对象,您不能将它们分配给名称。