0

アクター (Actor1) がコマンド ライン引数として 2 つの数値を受け取り、別のアクター Actor2 (合計を計算する) にメッセージを送信する scala でアクターを使用するプログラムを作成しています。Actor2 は結果を Actor1 に送信し、Actor1 は結果を画面に出力します。

class Actor1 extends Actor {
  def main(args: Array[String]) {   
    val n= Integer.parseInt(args(0))  
    val k= Integer.parseInt(args(1))  
    val actor2 = new Actor2   
    actor2 ! (n, k)  
  }

def act()
{    
           react{
                    case num: Integer =>
                    println(num)
                    case _=>
                    println("Sum not received")
                    exit

                   } 
}   
}
 class Actor2 extends Actor  {
    def act(){
       loop
       {
       react
            {
            case(n:Int, k:Int) =>
            val i = n + k
            val actor1 = new Actor1
             actor1 ! i}
         }
     }
    }

アクターを拡張するクラス内で main() を定義することは可能ですか? また、アクターがコマンド ライン引数を受け入れる他の方法はありますか? エラーが表示されます: class Actor1 needs to be abstract, because method act in trait Reactor type ()Unit は定義されていません.

4

1 に答える 1

1

まず最初に:デフォルトのScalaアクターの代わりにakkaを使用することを検討する必要があります。それはちょうど良いです..ほとんどすべての面で。

それはさておき、ここにあなたのためのいくつかの答えがあります:

  • mainメソッドは、(コンパニオンオブジェクトではなく)スタンドアロンオブジェクトにある必要があります。したがって、次のようなものを使用します。オブジェクト/クラスobject Main { def main(args:Array[String]) { ... } }を介してプログラムを開始します。Main(これは、クラス内の定義Actor1が非静的であり、コンパニオンオブジェクトを定義すると、.classファイル名が衝突するという問題が原因です。)

  • あなたのコードでは、角かっこに何か問題があるようです-または意図的にクラスActor2内に配置しましたか?Actor13つの別々のクラス/オブジェクトを作成するだけで、よりクリーンになりますActor1, Actor2, Main

  • Scalaアクターを作成するときは、明示的に開始する必要があります(akka 2.xではそうではありません)。だからあなたはへのあなたの呼び出しactor1.startなどを逃します。アクターが終了する前にプログラムが終了しないことに注意してください。したがって、それを追加した後、プログラムが停止しなくなるのではないかと考えないでください。

  • 最後に、いくつかのマイナーなヒント:

    • 使用を検討し!?、元の発信者に回答を返送することをお勧めします。これにより、適切な終了条件を設定することもできます。
    • Integer.parseInt("0")より簡単に次のように書くことができます "0".toInt
于 2012-09-10T06:21:42.643 に答える