2011-12-19 15 views
6

Mam szereg funkcji. Jak mogę uzyskać nazwy do wydrukowania w funkcji println()? W kodzie poniżej ja po prostu tego wyjścia:Drukowanie nazwy funkcji w println()?

< function2>
< function2>
< function2>

Załóżmy, że w moim prawdziwym kodzie mam dużo więcej funkcji z nazwami bardziej opisowych.

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()); 
    } 

} 

Odpowiedz

6

Funkcje w Scali nie mają więcej opisowych nazw niż Ints lub Listy mają opisowe nazwy; możesz złożyć argumenty za toString dając reprezentację jego wartości, ale to nie byłoby nazwisko.

Mogłeś jednak przedłużyć Function2 tak:

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

która będzie działać jak chcesz.

lub bardziej ogólnie

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 
} 

następnie użyć jako

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

itp

2

Nie można; nazwa zostanie utracona podczas konwersji z metody na funkcję2.