2010-05-14 22 views
14

Có rất nhiều ví dụ về các tác nhân trả lời bằng một tin nhắn khác lại cho người gửi, nhưng trong khi duyệt các tài liệu API tôi nhận thấy !! và!? các toán tử là một phần của đặc điểm CanReply (có vẻ như mới là 2.8: http://www.scala-lang.org/archives/rc-api/scala/actors/CanReply.html). Do đó, tôi tự hỏi liệu đó có phải là trường hợp có khối nhận/phản hồi trả về một giá trị, tức là làm cho kiểu trả về của PartialFunction không phải là Đơn vị không?Làm cách nào để các diễn viên Scala trả về một giá trị để trả lời một tin nhắn?

Tôi sẽ bắt đầu đào qua nguồn để cố gắng tìm ra cách chúng được sử dụng, nhưng nếu có ai có thông tin chi tiết hoặc biết về tài liệu hoặc ví dụ chuyên sâu hơn thì tôi sẽ biết ơn nhất .

Chúc mừng, Paul.

Trả lời

22

Trả lời có thể được gửi bằng phương pháp reply, như ở đây:

import scala.actors._ 
class Reverser extends Actor { 
    def act() { Actor.loop { react { 
    case s: String => Thread.sleep(1000); reply(s.reverse) 
    case _ => exit() 
    }}} 
} 

Có ba cách để chấp nhận một cách rõ ràng câu trả lời.

  • Sử dụng !!, trả về số Future, là lớp chứa hứa hẹn cung cấp cho bạn nội dung khi bạn cần. Nó trả về ngay lập tức, nhưng nếu bạn thực sự yêu cầu nội dung, bạn phải chờ cho đến khi luồng khác được thực hiện và điền vào yêu cầu.
  • Sử dụng !? mà không có thời gian chờ. Mã của bạn sẽ tạm dừng miễn là phải mất cho chuỗi khác trả lời.
  • Sử dụng !? với thời gian chờ. Mã của bạn sẽ tạm dừng cho đến khi nó được trả lời hoặc cho đến khi hết thời gian chờ, tùy điều kiện nào đến trước.

Dưới đây là một ví dụ về cả ba:

val r = new Reverser 
r.start 
val a = (r !! "Hi") 
a() match { 
    case s: String => println(s) 
    case _ => println("Error A") 
} 
val b = r !? "Hello" 
b match { 
    case s: String => println(s) 
    case _ => println("Error B") 
} 
val c = (r !? (500,"Howdy")) 
c match { 
    case Some(s: String) => println(s) 
    case Some(_) => println("Error C") 
    case None => println("Too slow!") 
} 
r ! None // None isn't a string, so r will stop running 

Và nếu bạn chạy này bạn sẽ có được

iH 
elloH 
Too slow! 
+0

Cảm ơn vì điều đó! Tôi cũng đã tự tìm kiếm và tìm thấy điều này: http://java.dzone.com/articles/scala-threadless-concurrent mà theo ngày cho thấy rằng các toán tử không phải là mới đến 2,8, thậm chí nếu đặc điểm CanReply là. – pdbartlett

+1

@pdbartlett: Đúng vậy. Đoạn mã trên cũng sẽ hoạt động ở 2,7, ngoại trừ '.reverse' không tạo ra chuỗi trong 2,7, vì vậy ví dụ sẽ không hoạt động trừ khi bạn thực hiện' .reverse.toString'. Nhưng tất cả các diễn viên/công cụ tương lai hoạt động tốt. –

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