基本的Scala演员:书中的例子根本不是“行动”
我是
Scala的新手,而且在
Java中过于生疏,除了一个完整的新手之外别无其他.所以我正在采取简单的步骤来学习它.
在看演员时,我尝试了一些东西,但遇到了许多NoClassDefFound错误.最后,我决定拿一本书的例子并在它之上构建,而不是调试我的第一次尝试.惊喜:书中的例子没有按预期工作! 以下是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 在执行时,它应该打印出Redford报价.但是,当我启动它时,没有任何反应,我回到命令行: D:progscala-2.8.1.finalpierric>scala testactors.scala D:progscala-2.8.1.finalpierric> 另一个例子来自Seven Weeks的Seven Programming Languages.就像这样(我只是改变了懒惰的字符串): import scala.actors._ import scala.actors.Actor._ case object Poke; case object Feed; class Kid() extends Actor { def act() { loop { react { case Poke => { println("Ow") println("Quit it") } case Feed => { println("gurgle") println("burp") } } } } } var bart = new Kid().start var lisa = new Kid().start println("starting") bart ! Poke lisa ! Poke bart ! Feed lisa ! Feed 这次它应该返回一个随机排序的“ow quit it”和“gurgle burp”的序列.但是,当我运行它时: D:progscala-2.8.1.finalpierric>scala testkids.scala starting D:progscala-2.8.1.finalpierric> 现在,另一个有趣的事情.如果我在act方法的开头添加一个简单的println行: class Kid() extends Actor { def act() { println("Kid initializing") loop { react { ... 然后我大部分时间都得到了: D:progscala-2.8.1.finalpierric>scala testkids.scala starting Kid initializing Kid initializing D:progscala-2.8.1.finalpierric> 但有时也是: 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.一台机器运行Windows XP 32位,另一台运行Windows 7 64位.我没有通过谷歌搜索找到任何与此类问题有关的内容…… 提前感谢任何能够了解这一点的人! 皮耶尔里克. 解决方法
这是因为scala脚本在主线程中完成后会立即退出.在具有多个线程的设置中,这非常糟糕(参见
Can Actors in Scala fail to process messages? (example in O’Reilly’s Programming 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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |