2012-03-16 52 views

回答

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  
2

你可以得到一個方法的引用,通過部分應用程序的功能:

scala> val foo = new Foo 
foo: Foo = [email protected] 

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> 
+0

我可以看到這是如何工作的,如果在選擇'bar'或'bat'時,我手上握着所有'Foo'。但是,這不需要我的'deepFunction'來獲取List [(Foo,()=> Unit)]? – 2012-03-16 22:28:38

+0

如果你想在它們之間進行多態選擇,那麼肯定你需要使用它們的類型並接受它們的容器。儘管你不一定需要List,但你可以例如使用可變參數或其他任何集合特徵,例如Seq,Iterable,Traversable,TraversableOnce等。 – 2012-03-18 21:51:48

1

方法不是對象斯卡拉,你不能指定他們的名字。

相關問題