2011-10-28 36 views
11

Cho một phương pháp xác định như sauScala Trả về một hàm void với 0 tham số, cú pháp xấu xí?

def descendEach(times:Int)(f:()=>Unit) { 
     for (i <- 1 to times) { 
      // other code 
      f() 
     } 
    } 

khi tôi sử dụng phương pháp này, tôi muốn để có thể viết

gd.descendEach(20){ 
    println(gd.cost) 
} 

nhưng trình biên dịch scala chỉ cho phép tôi nhận được ngay với

gd.descendEach(20){() => 
    println(gd.cost) 
} 

là loại xấu xí. Am i thiếu cái gì ở đây? Có thể viết nó theo cách đầu tiên tôi trình bày không?

Trả lời

21

Sử dụng cú pháp sau:

def descendEach[T](times:Int)(f: => T) 

Bằng cách này bạn có thể không chỉ vượt qua chức năng mà không cần thêm () => (điều này được gọi là đường chuyền theo tên), mà còn sử dụng các chức năng trả lại bất kỳ loại (không nhất thiết phải Unit) . Đó là đôi khi thuận tiện khi bạn có một chức năng hiện tại bạn muốn vượt qua nhưng không thực sự quan tâm đến giá trị trả về của nó:

def g() = 42 
descendEach(20)(g) 

Lưu ý rằng với cú pháp này, bạn chỉ đơn giản là sử dụng f, không f().

+2

Cảm ơn Tomasz đã sửa nó. Đối với ví dụ của tôi, chỉ cần làm 'f: => Unit' hoạt động là tốt, nhưng phiên bản Generic là tiện dụng để biết. – npiv

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