2013-03-22 33 views
6

nềnAKKA gửi một đóng cửa với diễn viên từ xa

tôi muốn gửi một đóng cửa để một diễn viên từ xa. từ xa diễn viên nên chạy đóng cửa trên dữ liệu của nó và gửi lại kết quả. Có thể không được khuyến khích, nhưng vì mục đích tò mò mà tôi muốn làm ngay bây giờ

Nhưng tôi quan sát thấy nếu đóng cửa được tạo thành một hàm ẩn danh, nó sẽ chụp đối tượng bên ngoài và cố gắng sắp xếp nó, thất bại nếu đối tượng bên ngoài không được tuần tự hóa, như trong trường hợp này.

class Client(server: ActorRef) extends Actor { 

    var every = 2 

    override def preStart() = { 
    println("client started. sending message....") 
    server ! new Message((x) => x % every == 0) 
    } 

} 

mã ở trên tạo ngoại lệ trong khi gọi cho diễn viên từ xa. tôi có thể định nghĩa một biến địa phương trong phương pháp preStart()

val every_ = every

và sử dụng nó thay cho biến thành viên diễn viên. Nhưng tôi cảm thấy nó là một giải pháp không phải là một giải pháp. và tôi sẽ phải rất cẩn thận nếu việc đóng cửa phức tạp hơn một chút.

Cách khác là định nghĩa một lớp kế thừa từ Function1[A,B] và gửi các thể hiện của nó như là đóng.

class MyFunc(every : Int) extends Function1[Int,Boolean] with Serializable { 

    def apply(v1 :Int) : Boolean = { 
    v1 % every == 0 
    } 
} 


server ! new Message(new MyFunc(every)) 

Nhưng điều này sẽ tách định nghĩa đóng cửa khỏi địa điểm được sử dụng và đánh bại toàn bộ mục đích sử dụng ngôn ngữ chức năng. và cũng làm cho việc xác định logic đóng cửa khó khăn hơn.

cụ Query

Có cách nào tôi có thể trì hoãn việc xác định cơ thể của Function1.apply và giao cho cơ thể của apply khi tôi tạo ra các thể hiện của MyFunc từ một đóng cửa được xác định tại địa phương?

ví dụ:

server ! new Message(new MyFunc(every){ // not valid scala code 
    x % every == 0 
}) 

trong đó every là biến địa phương?

về cơ bản tôi muốn kết hợp hai phương pháp, tức là gửi đối tượng Function1 cho tác nhân từ xa với nội dung Function1 được xác định bởi hàm anon được xác định tại vị trí mà thể hiện Function1.

Cảm ơn,

+0

Tôi đoán bạn biết những gì bạn đang làm nhưng tôi muốn để đảm bảo bạn biết rằng việc đóng các đóng được coi là một thực hành không tốt như được giải thích rõ ràng trong [documentation] (http://doc.akka.io/docs/akka/snapshot/general/actor-systems.html) - đoạn diễn viên Thực tiễn tốt nhất alinea 3 –

+0

cảm ơn vì đã chỉ ra. cách khác tôi có thể đóng gói hành vi đó trong một diễn viên và tạo ra nó một cách năng động? tức là quy định hành vi của diễn viên dựa trên việc đóng cửa thay vì gửi bản thân đóng cửa cho diễn viên. – weima

+0

Có rất nhiều điều bạn có thể làm nhưng tôi có cảm giác bạn đang cố gắng thực hiện giải pháp "sai"/khó xử cho một vấn đề cụ thể. Tôi tin rằng nếu bạn chỉnh sửa câu hỏi của mình và mô tả những gì bạn đang cố gắng đạt được, bạn sẽ nhận được phản hồi tốt hơn trên SO –

Trả lời

3

Chắc chắn, bạn có thể gửi hành vi để diễn viên, nhưng nó được coi là một thực tế xấu, và các câu hỏi của bạn là một câu trả lời tốt về câu hỏi: "tại sao".

Vì BGR đã chỉ ra rằng có phần đặc biệt trong documentation về câu hỏi này, nhưng không có ví dụ.

Vì vậy, khi bạn gửi đóng cửa dưới dạng tin nhắn, bạn gửi thêm một số trạng thái "ẩn" với nó. Nó có thể không được biến đổi như đã nói trong tài liệu, nhưng ngay cả trong trường hợp này nó có thể tạo ra vấn đề.

Vấn đề với scala ở đây là ngôn ngữ không đúng chức năng - đó là ngôn ngữ đa nguyên. Nói cách khác, bạn có thể có mã trong mô hình chức năng bên cạnh với mã theo phong cách bắt buộc.Không có vấn đề như vậy trong, ví dụ như haskell, đó là hoàn toàn chức năng.

Trong trường hợp "truy vấn cụ thể" của bạn, tôi sẽ đề nghị bạn sử dụng các hàm được xác định trước. Điều này là hoàn toàn tương đương với các biến thể với đóng cửa nhưng với một cú pháp trò chuyện chút. Vì bạn không tạo mã trong suốt thời gian chạy, tất cả các hàm bạn sử dụng được xác định trong tập hợp giới hạn và (trông giống như) được tham số hóa theo giá trị. Điều này làm cho mã của bạn không linh hoạt như với đóng cửa, nhưng cuối cùng nó sẽ là trường hợp tương đương.

Vì vậy, như một nét chủ đạo của tất cả các bài viết của tôi: nếu bạn sẽ gửi cho hành vi để diễn viên nó phải đá rắn nguyên tử (theo nghĩa không có bất kỳ phụ thuộc)

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