Tôi khá mới đối với Scala. Tôi đang cố gắng để hiểu làm thế nào/nếu scala không ràng buộc năng động khi đóng cửa được thông qua như là một phần của một tin nhắn cho một diễn viên.Ràng buộc biến Scala khi được sử dụng với Actors
Tôi đang sử dụng Akka 1.2 với Scala 2.9.
Tôi có đoạn mã sau (sửa đổi từ http://gleichmann.wordpress.com/2010/11/15/functional-scala-closures/)
var minAge = 18
val isAdult = (age: Int) => age >= minAge
actor ! answer(19, isAdult)
minAge = 20
actor ! answer(19, isAdult)
Về phía diễn viên, nó chỉ đơn giản áp dụng isAdult với tham số đầu tiên và in kết quả. Kể từ Scala sử dụng động ràng buộc (vì vậy tôi đã nói), tôi lại có thể ngờ
true
false
nhưng bằng cách nào đó kết quả là
false
false
Vậy là nó đúng là scala được ràng buộc các biến tĩnh và uống 18 làm giá trị của minAge cho cả hai thư trả lời? Có cách nào để giữ cho hành vi ràng buộc động trong khi sử dụng các bao đóng trong tin nhắn không?
Cảm ơn!
Cảm ơn! Điều này thật ý nghĩa. Vì vậy, isAdult được đánh giá một cách lười biếng và các biến không bao giờ bị ràng buộc cho đến khi diễn viên thực sự xử lý thông điệp. Có vẻ như nếu tôi đã chờ trả lời từ truy vấn đầu tiên trước khi chạy minAge = 20, tôi nhận được kết quả mong đợi. – royalflush
Điều đó là đúng, nhưng hãy nhớ đừng bao giờ làm điều đó ;-) Nghiêm túc, bạn sẽ không sử dụng diễn viên nếu bạn muốn chia sẻ trạng thái có thể thay đổi giữa chúng. Thật không may, Scala không cung cấp một cách để đóng "by-value", vì vậy điều duy nhất bạn có thể làm là tự bảo đảm rằng mọi thứ bạn đóng lại là 'val'. –
Tôi nghĩ rằng đối số là đúng trên một trường hợp máy duy nhất. nhưng với các diễn viên từ xa, tại sao không? Tôi có thể gửi một tin nhắn để đồng bộ hóa một trạng thái phân tán giữa hai diễn viên chẳng hạn? – royalflush