2011-12-09 40 views
5

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!

Trả lời

9

Hiểu biết về đóng cửa của bạn là chính xác. Tuy nhiên, nó đang thực hiện ràng buộc động, bạn đang giới thiệu các vấn đề tương tranh. Việc đóng cửa là ràng buộc với dữ liệu có thể thay đổi khiến cho việc đóng cửa có thể thay đổi. Mô hình diễn viên chỉ giải quyết các vấn đề đồng thời khi bạn truyền dữ liệu không thay đổi nghiêm ngặt giữa các diễn viên. Bạn có thể viết nó theo thứ tự thời gian dường như nhưng trình lập lịch diễn viên thay đổi thứ tự của các sự kiện. Và vì isAdult có thể thay đổi thứ tự các kết quả.

actor ! answer(19, isAdult) // message put in actor queue 
minAge = 20 
actor ! answer(19, isAdult) // message put in actor queue 
// later... 
// actor handles answer(19, isAdult) 
// actor handles answer(19, isAdult) 
+0

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

+2

Đ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'. –

+0

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

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