Распечатывать имя функции в println ()? - PullRequest
6 голосов
/ 19 декабря 2011

У меня есть массив функций. Как я могу получить имена для печати в функции 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());
   }

}

Ответы [ 2 ]

6 голосов
/ 19 декабря 2011

Функции в 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 голосов
/ 19 декабря 2011

Вы не можете; имя теряется при преобразовании метода в функцию 2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...