4

私はスカラが初めてです。Actor を学習するとき、def の 1 行を節約するために拡張しようとしました。

import scala.actors.Actor
import Actor._
class Actoo(actoo: =>Unit) extends Actor {
    def act() {actoo}
}
object run extends Application {
    /* 
    // this one runs well
    val a = new Actor {
        def act() {
            receive { case 1 => println("1") }
        }
    }
    */
    val a = new Actoo {
        receive { case 1 => println("1") }
    }
    a.start
    a ! 1
}

次に、例外トレースは次のようになります。

java.lang.AssertionError: assertion failed: receive from channel belonging to other actor
    at scala.Predef$.assert(Predef.scala:92)
    at scala.actors.Actor$class.receive(Actor.scala:424)
    at Actoo.receive(actoo.scala:3)
    at run$$anon$1.<init>(actoo.scala:16)
    at run$.<init>(actoo.scala:15)
    at run$.<clinit>(actoo.scala)
    at run.main(actoo.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at scala.tools.nsc.ObjectRunner$$anonfun$run$1.apply(ObjectRunner.scala:75)
    at scala.tools.nsc.ObjectRunner$.withContextClassLoader(ObjectRunner.scala:49)
    at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:74)
    at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:154)
    at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

同じことを実行できる多くの代替手段があるかもしれませんが、上記のコードが機能しない理由を知っておくとよいでしょう。

4

3 に答える 3

8

とても簡単です。実際、この動作はアクター ライブラリによるものではありません。コードの一部

val a = new Actoo {
        receive { case 1 => println("1") }
    }

Actooは、初期化本体を使用しreceive {...}て「の新しいインスタンスを作成する」とコンパイラによって解釈され、val actooと等しくなり()ます。したがって、あなたのコードは

val a = new Actoo() {
        receive { case 1 => println("1") }
    }

コードを修正するには、次のように記述する必要があります

val a = new Actoo ({
        receive { case 1 => println("1") }
    })
于 2009-07-27T08:16:11.667 に答える
5

シングルトンには、必要なことを行うactorメソッドもあります。Actorそれstartはあなたを自動的に呼び出します。

import scala.actors.Actor
import Actor._

val a = actor {
  receive { case 1 => println("1") }
}

a ! 1
于 2009-07-28T03:22:25.513 に答える