Trong ví dụ mã sau, tôi không hiểu tại sao hàm fun có thể được chuyển thành đối số cho phương thức addAction
. Phương thức fun
thuộc loại Unit
, trong khi phương thức addAction
mong đợi một chức năng thuộc loại () => Unit
.Phương thức và phương thức Scala dưới dạng tham số
Nếu fun
là loại () => Unit
, thì tại sao không trình biên dịch phàn nàn rằng fun
là loại Unit
, khi tôi cố gắng thêm fun
đến những hành động danh sách: actions = fun :: actions
?
package myscala
object MyScala {
def fun() { println("fun1 executed.") }
def addAction(a:() => Unit) {
actions = a :: actions
}
var actions: List[() => Unit] = List()
def main(args: Array[String]) {
// the following line would produce a compiler error (found: Unit, required:() => Unit), it's OK
// actions = fun :: actions
actions = (() => fun) :: actions // OK
// I would expect the same compiler error here (found: Unit, required:() => Unit), but it's OK why?
addAction(fun)
actions.foreach(_()) // prints twice "fun1 executed"
}
}
Có, tôi có. Điều này bây giờ có vẻ hiển nhiên đối với tôi (nó không hề có lúc đó). Khi trình biên dịch có thể suy ra rằng một kiểu hàm được mong đợi, tôi có thể chỉ cần viết 'fun', nếu không tôi phải làm cho nó rõ ràng rằng tôi đang truyền một hàm. Cảm ơn các câu trả lời rõ ràng cho tất cả các bạn! – Manu
@Manu: Xem xét chấp nhận câu trả lời mà bạn cho là câu trả lời hay nhất (không nhất thiết là câu trả lời này) –