2012-03-16 6 views
3

関連:How do you assign a function to a value in Scala?インスタンスメソッドをScalaの値にどのように割り当てるのですか?

を考える:

class Foo{ 
    def bar = println("bar") 
    def bat = println("bat") 
} 

は、どのように私はそれがFoo.barまたはFoo.batのいずれかを指すようfnRefを作成するのですか?

def deepFunction(foos : List[Foo], fnRef :()=>Unit) = { 
    foos.map(_.fnRef) //May call either bar or bat 
} 

ボーナス:それはFooのクラス内でその署名の唯一の方法だようfnRefを制約することは可能ですか?

答えて

6

あなたはしていません。 :-)代わりに、ファーストクラスの機能に関してコードを記述します。 Scalaでこれをうまく利用できるのは、タイプT => R_.methodの関数リテラルを作成することです。ここで、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)]を取ることを要求しないでしょうか? –

+0

ポリモーフィックにそれらを選択する場合は、そのタイプを使用し、それらのコンテナを受け入れる必要があります。リストは必ずしも必要ではありませんが、例えば、varargs、Seq、Iterable、Traversable、TraversableOnceなどの他のコレクション特性を持つことができます。 –

1

方法には、オブジェクトではありませんScalaでは、名前に割り当てることはできません。

関連する問題