2011-12-19 50 views
6

Tôi có một loạt các chức năng. Làm thế nào tôi có thể lấy tên in trong một hàm println()? Trong đoạn mã dưới đây tôi chỉ nhận được kết quả này:In ra tên của hàm trong println()?

< function2>
< function2>
< function2>

Giả sử rằng trong mã thực của tôi, tôi có chức năng nhiều hơn với tên mô tả hơn.

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

} 

Trả lời

6

Các chức năng trong Scala không có tên mô tả nào ngoài Ints hoặc Lists có tên mô tả; bạn có thể làm cho một trường hợp cho toString cho một đại diện của giá trị của nó, nhưng đó sẽ không phải là một tên.

Bạn có thể, tuy nhiên, mở rộng Function2 như sau:

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

mà sẽ hoạt động như bạn muốn.

Hoặc tổng quát hơn

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 
} 

sau đó sử dụng như

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

, vv

2

Bạn không thể; tên bị mất trong quá trình chuyển đổi từ một phương thức sang một Function2.

Các vấn đề liên quan