2011-06-23 8 views
1

私はこれを再現しようとしていますexample。 すべてはコンパイルが、私はそれを実行すると、すべての私の結果は次のようになります。ここではアクターが発信者にメッセージを送り返す方法を教えてください。

scala> NameResolver ! ("www.scala-lang.org", self) 

    scala> self.receiveWithin(0) { case x => x } 
    res0: Any = TIMEOUT // and not Some(www.scala-lang.org/128.178.154.102) 

    scala> NameResolver ! ("wwwwww.scala-lang.org", self) 

    scala> self.receiveWithin(0) { case x => x } 
    res1: Any = TIMEOUT // and not None 

は私の例です:

import scala.actors._ 
import scala.actors.Actor._ 

case class Plus(x: Int, y: Int) 

val concurrentCalculator = actor { 
    while(true) 
     receive { 
     case Plus(x, y) => println(x + y) 
     case (Plus(x, y), caller: Actor) => caller ! (x + y) 
     } 
} 

scala> concurrentCalculator ! Plus(2,3) 
5 

scala> concurrentCalculator ! (Plus(2,3), self) 

scala> self.receiveWithin(1000) { case x => x } 
res0: Any = TIMEOUT // WTF? 

なぜ私の代わりに有効な結果のTIMEOUTを取得していますか?

答えて

4

あなたがチェックできるため、ScalaのREPLが機能する方法にないコードブロック内の異なるコール、上selfリターン異なる値(すべての評価される式)別のクラスにコンパイルされています

コードの1つのブロックに
scala> self 
res3: scala.actors.Actor = [email protected] 

scala> self 
res4: scala.actors.Actor = [email protected] 

それが明示的に俳優として宣言されていない場合でも、それは動作します:

scala> { 
    | concurrentCalculator ! (Plus(2,3), self) 
    | self.receiveWithin(1000) { case x => x } 
    | } 
res9: Any = 5 
+0

Thxたくさん。私が再現しようとした例は、 "Programming in Scala"(または私が質問に直接投稿したリンク)から取り出されたものであり、明らかにREPLを使用しています。 – agilesteel

+0

ああ、はい、私は 'import scala.actors.Actor._'は実際には俳優である' self'というメソッドを定義していることを忘れていました。私の悪い。 –

+0

その本はScala 2.7のために書かれています。各俳優がスレッドを取ってきてくれました。しかしこれはもはや事実ではない。 Scalaはかなり高速に動くターゲットです:) –

0

ここでの問題は、呼び出し元コードがアクタではないため、concurrentCalculatorアクタの2番目のケースが一致しないことです。

ではなく、これを試してみてください、そして、あなたが期待するものを見る必要があります。

val me = actor { 
    concurrentCalculator ! (Plus(2,3), self); 
    self.receiveWithin(1000) { case x => println(x) } 
} 
関連する問題