我对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
Run Code Online (Sandbox Code Playgroud)
在执行时,它应该打印出Redford报价.但是,当我启动它时,没有任何反应,我回到命令行:
D:\prog\scala-2.8.1.final\pierric>scala testactors.scala
D:\prog\scala-2.8.1.final\pierric>
Run Code Online (Sandbox Code Playgroud)
另一个例子来自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
Run Code Online (Sandbox Code Playgroud)
这次它应该返回一个随机排序的"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>
Run Code Online (Sandbox Code Playgroud)
现在,另一个有趣的事情.如果我在act方法的开头添加一个简单的println行:
class Kid() extends Actor {
def act() {
println("Kid initializing")
loop {
react {
...
Run Code Online (Sandbox Code Playgroud)
然后我大部分时间都得到了:
D:\prog\scala-2.8.1.final\pierric>scala testkids.scala
starting
Kid initializing
Kid initializing
D:\prog\scala-2.8.1.final\pierric>
Run Code Online (Sandbox Code Playgroud)
但有时也是:
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)
Run Code Online (Sandbox Code Playgroud)
所以我在这里,无知......因为那些是"书外"的例子,实际上有两本书!似乎没有用.我试过两台不同的机器,它们都有可能有不同的JVM.在这两种情况下,我都运行scala 2.8.1.final.一台机器运行Windows XP 32位,另一台运行Windows 7 64位.我没有通过谷歌搜索找到任何与此类问题有关的内容......
在此先感谢任何能够阐明这一点的人!
皮耶尔里克.
这是因为scala脚本在主线程中完成后会立即退出.在具有多个线程的设置中,这非常糟糕(请参阅Scala中的Can Actors无法处理消息?(O'Reilly的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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1479 次 |
| 最近记录: |