2009-10-23 11 views
7

tôi đang học Scala và tôi đang cố gắng để lưu trữ một chức năng trong một var để đánh giá nó sau này:Scala: Làm thế nào để "lưu trữ" một hàm trong một var?

var action:() => Any =() => {} 
def setAction(act: => Any) { 
    action = act 
} 

nhưng điều đó không biên dịch:

error: type mismatch;
found: Any
required:() => Any
action = act

Vì vậy, có vẻ như với tôi rằng trong action = act thay vì gán hàm, nó sẽ đánh giá nó và gán kết quả.
Tôi không thể tìm hiểu cách chỉ định chức năng mà không đánh giá nó.

Cảm ơn!

Trả lời

15

Loại ghi chú "() => Bất kỳ" không giống như tham số theo tên "=> Bất kỳ". Loại "() => Bất kỳ" là một hàm không có tham số và trả về Bất kỳ, trong khi tham số theo tên "=> Bất kỳ" chậm trễ thực hiện tham số cho đến khi nó được sử dụng và trả về Bất kỳ.

Vì vậy, những gì bạn cần làm ở đây là như sau:

var action:() => Any = null 

def setAction(act: => Any) = action =() => act 

setAction(println("hello")) // does not print anything 

action() // prints "hello" 

setAction(123) 

action() // returns 123 
+0

Cảm ơn Walter, nó đã giúp tôi rất nhiều để hiểu thêm một chút scala – Damian

2

Tôi nghĩ rằng bạn đang khai tham số là sai. Đây có lẽ là những gì bạn muốn nếu bạn chỉ đơn giản muốn lưu trữ một hàm trong một var để sử dụng sau:

def setAction(act:() => Any) { 
    action = act 
} 

và sau đó:

scala> def p() { println("hi!") } 
p:()Unit 

scala> setAction(p) 

scala> action() 
hi! 
res2: Any =()