扩展Scala Actor

4 scala actor

我是斯卡拉的新手.在学习Actor时,我试图将其扩展为保存一行def:

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
}
Run Code Online (Sandbox Code Playgroud)

然后异常跟踪如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

可能有许多替代方案可以做同样的事情,但我最好知道上面的代码不起作用的原因.

Ale*_*rov 8

这很容易.事实上,这种行为不是由于actor库造成的.这段代码

val a = new Actoo {
        receive { case 1 => println("1") }
    }
Run Code Online (Sandbox Code Playgroud)

被编译器解释为Actoo"使用初始化主体创建新实例" receive {...}val actoo变得相等().因此,您的代码相当于

val a = new Actoo() {
        receive { case 1 => println("1") }
    }
Run Code Online (Sandbox Code Playgroud)

为了修复代码,您需要编写

val a = new Actoo ({
        receive { case 1 => println("1") }
    })
Run Code Online (Sandbox Code Playgroud)


Jor*_*tiz 5

actorActor单身人士中还有一种方法可以满足你的需要.它甚至start会自动呼唤你.

import scala.actors.Actor
import Actor._

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

a ! 1
Run Code Online (Sandbox Code Playgroud)