2012-04-06 7 views
5

次は手動プロセスScalaで明示的なクラス引数を取ってクラスメソッドを関数に自動的に変換する方法?

case class A(x: Int) { def f(y: Int) = x * y } 
val af: (A => Int => Int) = _.f 

val a = A(4) 
val r = af(a)(2) 

afのような機能を取得するconventient方法はありますか?おそらく反射を使用しないでA magic fのようなものです。 import A#magic._を介してクラスのすべてのパブリックメソッドをインポートする機能は、ボーナスです。

答えて

11

この方法では、10個のシンボル短いです:

val af = (_: A).f _ 
2

あなたはAのインスタンスを作成し、メソッドをインポートすることができます:xは値を保持する必要があるので

val a = A(4) 
import a._ 

は、これを行うための他の方法はありません。

object A { 
    def f(x:Int)(y:Int) = x*y 
} 

import A._ 

を私の知る限り、カレー(constructor)(method signature)関数に、クラスのすべてのメソッドをオンにすることはできません知っている:あなたは、しかし、クラスをAFとそれに応じてメソッドのシグネチャを変更する代わりに、シングルトンオブジェクトを作成することができます。

2

uがすることを望むなぜ私は知らないが、uは確かに次のことを達成することができます:

scala> case class A(x:Int){ def f(y:Int)=x*y} 
defined class A 

scala> val af = A(2).f _ 
af: (Int) => Int = <function1> 

scala> af(3) 
res0: Int = 6 
関連する問題