2011-12-19 15 views
6

Bir dizi işleve sahibim. Println() işlevinde yazdırmak için adları nasıl alabilirim? Sadece bu çıktıyı almak Aşağıdaki kodda:Bir fonksiyonun adını println() içinde mi yazdırıyorsunuz?

< İşlevsiz2>
< İşlevsiz2>
< İşlevsiz2>

benim gerçek kodda ben daha açıklayıcı adlar ile çok daha fazla fonksiyonlara sahip olduğunu varsayalım.

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

} 

cevap

6

Scala'daki işlevler, Int veya Listelerden daha açıklayıcı adlar içermeyen açıklayıcı adlara sahip değildir; Değerinin bir temsilini veren toString için bir dava açabilirsiniz, ancak bu bir isim olmaz.

Ancak, böylece Function2 uzatmak olabilir: İstediğiniz olarak hareket edecek

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

.

ya da daha genel olarak

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 
} 

ve saire

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

olarak kullanmak
2

Yapamazsınız; Bir yöntemden Function2'ye dönüştürme sırasında isim kaybolur.

İlgili konular