println()に関数の名前を出力しますか?

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



私の実際のコードでは、よりわかりやすい名前でもっと多くの関数があるとします。

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

2 答え

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", _ + _)

6
追加された

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

2
追加された