基本Scala演员:书中的例子不是;署理;完全 我对斯卡拉很陌生,在java中太生疏了,我认为我自己就是一个完全的新手。所以我正在采取简单的步骤来学习它

基本Scala演员:书中的例子不是;署理;完全 我对斯卡拉很陌生,在java中太生疏了,我认为我自己就是一个完全的新手。所以我正在采取简单的步骤来学习它,scala,actor,Scala,Actor,在看演员的时候,我尝试了一些事情,但是遇到了很多错误。最终,我决定以一本书为例,在它的基础上进行构建,而不是调试我的第一次尝试。令人惊讶的是:书中的例子并不像预期的那样有效 下面是O'Reilly的Scala编程示例: import scala.actors.Actor class Redford extends Actor { def act() { println("A lot of what acting is, is paying attention.") } } v

在看演员的时候,我尝试了一些事情,但是遇到了很多错误。最终,我决定以一本书为例,在它的基础上进行构建,而不是调试我的第一次尝试。令人惊讶的是:书中的例子并不像预期的那样有效

下面是O'Reilly的Scala编程示例:

import scala.actors.Actor

class Redford extends Actor {
  def act() {
    println("A lot of what acting is, is paying attention.")
  }
}

val robert = new Redford
robert.start
它应该在执行时打印雷德福德的引文。但是,当我启动它时,什么也没有发生,我回到命令行:

D:\prog\scala-2.8.1.final\pierric>scala testactors.scala

D:\prog\scala-2.8.1.final\pierric>
另一个例子来自七周内的七种编程语言。是这样的(我只是出于懒惰才更改字符串):

这一次,它应该返回一个随机顺序的“ow quit it”和“gurgle burp”。但是,当我运行它时:

D:\prog\scala-2.8.1.final\pierric>scala testkids.scala
starting

D:\prog\scala-2.8.1.final\pierric>
现在,另一件有趣的事。如果我在act方法的开头添加一个简单的println行:

class Kid() extends Actor {
    def act() {
        println("Kid initializing")
        loop {
            react {
                ...
然后我得到了大部分的时间:

D:\prog\scala-2.8.1.final\pierric>scala testkids.scala
starting
Kid initializing
Kid initializing

D:\prog\scala-2.8.1.final\pierric>
但有时也:

starting
Kid initializing
Kid initializing
scala.actors.Actor$$anon$1@5a9de6: caught java.lang.NoClassDefFoundError: Main$$anon$1$Fee
    java.lang.NoClassDefFoundError: Main$$anon$1$Feed$
            at Main$$anon$1.Main$$anon$$Feed(testkids.scala:5)
            at Main$$anon$1$$anonfun$1.apply$mcV$sp(testkids.scala:31)
            at scala.actors.Actor$$anon$1.act(Actor.scala:135)
            at scala.actors.Reactor$$anonfun$dostart$1.apply(Reactor.scala:222)
            at scala.actors.Reactor$$anonfun$dostart$1.apply(Reactor.scala:222)
            at scala.actors.ReactorTask.run(ReactorTask.scala:36)
            at scala.concurrent.forkjoin.ForkJoinPool$AdaptedRunnable.exec(ForkJoinPool.java:6
            at scala.concurrent.forkjoin.ForkJoinTask.quietlyExec(ForkJoinTask.java:422)
            at scala.concurrent.forkjoin.ForkJoinWorkerThread.mainLoop(ForkJoinWorkerThread.ja
            at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:32
    Caused by: java.lang.ClassNotFoundException: Main$$anon$1$Feed$
            at java.net.URLClassLoader$1.run(Unknown Source)
所以我在这里,不知所措。。。因为这些都是“出类拔萃”的例子,实际上是出类拔萃!而且似乎不起作用。我在两台不同的机器上试过,它们很可能有不同的JVM。在这两种情况下,我都运行了scala 2.8.1.final。一台机器运行32位Windows XP,另一台运行64位Windows 7。我在谷歌上没有找到任何与这类问题相关的东西

提前感谢任何能对此有所启发的人


Pierric。

这是因为在主线程中运行的scala脚本一完成就很难退出。这在具有多个线程的设置中非常糟糕(请参阅)。相反,如果启动scala并按如下方式加载脚本:

# scala
scala> :load testactors.scala
Loading testactors.scala...
import scala.actors.Actor
defined class Redford
robert: Redford = Redford@29e07d3e
res0: scala.actors.Actor = Redford@29e07d3e

scala> A lot of what acting is, is paying attention.

谢谢事实上,它是这样工作的。请注意,我真的希望能够构建Scala脚本,就像我习惯Ruby脚本一样。即使Ruby更适合于小规模的黑客,它也是通过实践学习语言的好方法……从您的链接来看,它似乎是同步的,等待是可以帮助的关键字。我试着在kids示例中为其中一个孩子添加一个同步等待,结果成功了。但是,由于需要等待两个孩子,导致脚本完全运行,但最后挂起。由于我不明白这里到底发生了什么,我想我需要关于这个同步的东西的进一步信息(似乎是一个Java概念,但我不知道,因为在学习了很多年的基础知识之后,我从来没有真正使用过Java)。您认为我可以通过阅读编程Scala或其他Scala书籍来找到关于这个概念的解释吗?除了等待其他线程,您还必须要求它们停止处理。如果没有,他们将继续等待新消息。您可以通过在退出消息上运行actors exit方法来实现这一点。谢谢thoredge。实际上,我还修改了Kids示例,在收到提要消息时调用exit方法(在打印“dialog”行之后)。当我等待一个参与者时,它通常已经收到提要消息,并且应该调用exit方法。然而,这只在我等待其中一个的时候起作用。。。好吧,不管怎样,我想现在我已经有了基本的例子,我会多学习一些,希望我能很快理解!
# scala
scala> :load testactors.scala
Loading testactors.scala...
import scala.actors.Actor
defined class Redford
robert: Redford = Redford@29e07d3e
res0: scala.actors.Actor = Redford@29e07d3e

scala> A lot of what acting is, is paying attention.