我正在学习 Scala this book ,并且在尝试运行其中一个示例后出现错误。代码:
shapes.scala
package shapes {
class Point(val x: Double, val y: Double) {
override def toString() = "Point(" + x + "," + y + ")"
}
abstract class Shape() {
def draw(): Unit
}
class Circle(val center: Point, val radius: Double) extends Shape {
def draw() = println("Circle.draw: " + this)
override def toString() = "Circle(" + center + "," + radius + ")"
}
class Rectangle(val lowerLeft: Point, val height: Double, val width: Double)
extends Shape {
def draw() = println("Rectangle.draw: " + this)
override def toString() =
"Rectangle(" + lowerLeft + "," + height + "," + width + ")"
}
class Triangle(val point1: Point, val point2: Point, val point3: Point)
extends Shape {
def draw() = println("Triangle.draw: " + this)
override def toString() =
"Triangle(" + point1 + "," + point2 + "," + point3 + ")"
}
}
shapes-actor.scala
package shapes {
import scala.actors._
import scala.actors.Actor._
object ShapeDrawingActor extends Actor {
def act() {
loop {
receive {
case s: Shape => s.draw()
case "exit" => println("exiting..."); exit
case x: Any => println("Error: Unknown message! " + x)
}
}
}
}
}
shapes-actor-script.scala
import shapes._
ShapeDrawingActor.start()
ShapeDrawingActor ! new Circle(new Point(0.0,0.0), 1.0)
ShapeDrawingActor ! new Rectangle(new Point(0.0,0.0), 2, 5)
ShapeDrawingActor ! new Triangle(new Point(0.0,0.0),
new Point(1.0,0.0),
new Point(0.0,1.0))
ShapeDrawingActor ! 3.14159
ShapeDrawingActor ! "exit"
现在我尝试从命令行运行以下命令:
scalac shapes.scala shapes-actor.scala
scala -cp . shapes shapes-actor-script.scala
第一个命令将类编译为 shapes
目录中的 .class
文件,但第二个命令引发错误:
/Users/simon/Documents/playground/code-examples/Introdu
cingScala/shapes-actor-script.scala:3: error: not found
: value shapes
import shapes._
^
...
我编译/运行程序的方式有问题吗?
最佳答案
您似乎将 Scala 视为 Python。不幸的是,这行不通。我认为你误解了什么
% scala -cp . shapes shapes-actor-script.scala
的意思是。当您执行该命令时,至少在 OS X 10.11.5 上;斯卡拉 2.11.8; Java 1.8.0_60;然后你会得到这个错误:
java.io.IOException: no such file: shapes
at scala.tools.nsc.ScriptRunner.runScript(ScriptRunner.scala:194)
at scala.tools.nsc.ScriptRunner.runScriptAndCatch(ScriptRunner.scala:205)
at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:67)
at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)
它提示无法找到 shapes
因为我们搞乱了 exec 语法。请记住,语法是 scala -cp PATHS CLASS ,其中 shell 会将 PATHS 视为单个参数。所以上面的命令告诉 Scala 执行类名 shapes
的 main 方法,而我们没有。
我们可以通过更正命令并使用 :
连接路径来解决此问题。像这样:
% scala -cp .:shapes shapes-actor-script.scala
现在我们遇到了这个错误:
error: error while loading ShapeDrawingActor, class file 'shapes/ShapeDrawingActor.class' has location not matching its contents: contains class ShapeDrawingActor
error: error while loading Circle, class file 'shapes/Circle.class' has location not matching its contents: contains class Circle
error: error while loading Point, class file 'shapes/Point.class' has location not matching its contents: contains class Point
error: error while loading Rectangle, class file 'shapes/Rectangle.class' has location not matching its contents: contains class Rectangle
error: error while loading Triangle, class file 'shapes/Triangle.class' has location not matching its contents: contains class Triangle
5 errors found
这里的问题有两个:
- 1) Scala 将递归地加载您在类路径中指定的每个目录的每个类文件。所以我们双重加载每个文件。
- 2) scala
期望类文件的目录布局与包布局相匹配,这意味着如果我们将 shapes
列为唯一的类路径目录,然后尝试加载类 Shapes.Triangle
那么我们真的在尝试查找并加载文件shapes/shapes/Triangle.class
。那不存在,所以脚本失败。
让我们从类路径中删除 shapes
并重试:
% scala -cp . shapes-actor-script.scala
Circle.draw: Circle(Point(0.0,0.0),1.0)
Rectangle.draw: Rectangle(Point(0.0,0.0),2.0,5.0)
Triangle.draw: Triangle(Point(0.0,0.0),Point(1.0,0.0),Point(0.0,1.0))
Error: Unknown message! 3.14159
exiting...
它有效!
实际上,您还有其他几种方法来调用此脚本。默认情况下,scala 命令将从 .
中查找类文件,因此我们可以编写:
% scala shapes-actor-script.scala
如果您想将 shapes-actor-script.scala 作为真正的脚本执行,那么最简单的方法是按照标题 Script it! 下的说明进行操作。只需添加:
#!/bin/sh
exec scala "$0" "$@"
!#
...rest of shapes-actor-script.scala
然后,您可以像执行任何其他脚本一样在命令行上执行它(确保该文件可执行!):
% ./shapes-actor-script.scala
祝你学习scala好运!
关于scala - 从命令行运行时找不到包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38025022/