2011-12-19 5 views
6

私は機能の配列を持っています。 println()関数で印刷する名前を取得するにはどうすればよいですか?私はこの出力を取得する次のコードで:println()に関数の名前を出力しますか?

<機能2>
<機能2>
<機能2>

が私の本当のコードで、私はもっと説明的な名前を持つ多くの機能を持っていると仮定します。

def printNames() { 

    def f1(x: Int, y: Int): Int = x + y 

    def f2(x: Int, y: Int): Int = x - y 

    def f3(x: Int, y: Int): Int = x * y 

    val fnList = Array(f1 _, f2 _, f3 _) 
    for (f <- fnList) { 
    println(f.toString()); 
    } 

} 

答えて

6

Scalaの関数は、IntsやListsにわかりやすい名前があります。その値の表現を与えるtoStringのケースを作ることができますが、それは名前ではありません。

ただし、これFunction2を拡張することができます:あなたが望むように動作します

object f1 extends Function2[Int, Int, Int] { 
    def apply(a: Int, b: Int) = a + b 
    override def toString = "f1" 
} 

を。

以上の一般

class NamedFunction2[T1,T2,R](name: String, f: Function2[T1,T2,R]) 
             extends Function2[T1,T2,R] { 
    def apply(a: T1, b: T2): R = f.apply(a, b) 
    override def toString = name 
} 

その後、

val f1 = new NamedFunction2[Int, Int, Int]("f1", _ + _) 

など

として使用
2

できません。メソッドからFunction2への変換中に名前が失われます。

関連する問題