1

いくつかのチュートリアルに導かれて (文字列) メッセージをアクターに送信し、そのアクターがコンソールへの出力で応答する単純な Scala アクターの例を取得しようとしました。私のコードは次のとおりです。

import scala.io.Source
import scala.actors.Actor

object ProtTest {

  class testActor extends Actor {
    def receive = { 
      case "you" => Console.println("Hello you!")
      case _ => Console.println ("Hello ???")
    }
  }

  val t = new testActor
  t ! "you"
}

残念ながら、「def receive = {」で次のエラーメッセージが表示され、かなり長い間スタックしています。

Missing parameter type for expanded function 
The argument types of an anonymous function must be fully known (SLS 8.5)
Expected Type was: ?

エラー メッセージのクエスチョン マークが何を意味するのか、どのように例を修正すればうまくいくのか、まったくわかりません。

4

3 に答える 3

5

アクターの実装について少し混乱しているようです。testActorコードは Akka アクターに対して有効ですが Scala アクター ライブラリを使用しています。

Akka と scala.actors は、アクター モデルの 2 つの異なる実装です。Scala アクターは元の実装でしたが、現在では Akka の方が人気があり (IMO よりもはるかに優れています)、Scala 2.10 の時点では Scala にバンドルされている標準実装です (scala.actors は存在しますが、2.10 では非推奨です)。

実際、scala アクターを適切に実装する方法はわかりませんが、アクターを Akka で実行する方法は次のとおりです。

import akka.actor._

object ProtTest {

  class testActor extends Actor {
    def receive = { 
      case "you" => Console.println("Hello you!")
      case _ => Console.println ("Hello ???")
    }

    override def postStop() {
      context.system.shutdown
    }
  }

  val system = ActorSystem("test")
  val t = system.actorOf(Props[testActor])
  t ! "you"
  t ! PoisonPill
  system.awaitTermination

}

ご覧のとおり、Akka ではアクター システムを適切にセットアップしてシャットダウンするために小さなボイラープレートが必要ですが、メインのアクター コードは変更されていません。このpostStopメソッドは、アクターがシャットダウンした後に呼び出されます。これは、アクターがPoisonPillメッセージを受信したときに発生します。

于 2013-01-22T16:15:57.270 に答える
3

receiveあなたが実装する方法ではありません。を呼び出すactときに、を実装する必要があります。 receive

  class testActor extends Actor {
    def act = {
      while (true) {
        receive {
          case "you" => Console.println("Hello you!")
          case _ => Console.println ("Hello ???")
        }
      }
    }
  }

呼び出すreceiveメソッドも同様です。{..}それに渡す引数は、case 節を含むコードのブロックです。この引数の型は部分関数です。あなたの場合、String(「あなた」は文字列であるため、scala が推測する) から(返されるのはUnitscala のバージョン) への関数です。voidprintln

(部分関数が一連のステートメントとどのように等価であるかについての適切な説明については、Twitter の Scala School を参照してcaseください)。

基本的な scala の概念を理解すれば、コンパイル エラー メッセージを理解するのは非常に簡単です_

t.startまた、メッセージを受信する場合は、アクター インスタンスを開始する必要があります。

まだ非推奨ではありませんが、ほとんどの人は (他の回答が指摘しているように) Akka アクターを好みます。 Scala 2.10 以降scala.actors.Actor、Akka アクターを優先して非推奨になりました。

(補足として、そのコードを機能させたい場合はProtTest、拡張として宣言するか、メイン メソッドを使用しAppて呼び出しt ! "you"をクラス (またはオブジェクト) に移動する必要もあります)

于 2013-01-22T15:20:15.580 に答える
0

私はScalaのアクターシステムよりもAkkaを使用していますが、...ここに短いチュートリアルがあります。そこの例から、receiveブロックはループ内(たとえばwhile (true) {...})、def act()メソッド内にある必要があることがわかります。

于 2013-01-22T15:20:16.240 に答える