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,
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 –
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
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 –