【发布时间】:2011-04-13 07:39:07
【问题描述】:
我对 Scala 非常陌生,而且对 Java 太生疏了,我认为自己除了是一个完整的新手之外什么都不是。所以我正在采取简单的步骤来学习它。
在查看演员时,我尝试了一些方法,但遇到了许多 NoClassDefFound 错误。最终,我决定以书本示例为基础,而不是调试我的第一次尝试。惊喜:书中的示例没有按预期工作!
这是 O'Reilly 的 Programming 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>
另一个例子来自七周内的七种编程语言。是这样的(我只是懒得换弦了):
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:\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)
所以我在这里,一无所知......因为这些是“书外”的例子,实际上是两本书!并且似乎不起作用。我在 2 台不同的机器上试过,它们很可能有不同的 JVM。在这两种情况下,我都运行了 scala 2.8.1.final。一台机器运行 Windows XP 32 位,另一台运行 Windows 7 64 位。通过谷歌搜索,我没有找到与此类问题相关的任何内容...
提前感谢任何能对此有所了解的人!
皮埃尔。
【问题讨论】: