scala - 从命令行运行时找不到包

标签 scala

我正在学习 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/

相关文章:

Scalaz - 无法取消应用类型 StateT[Future, Foo, Bar]

json - 如何在Spark SQL中查询StringType的1个字段具有json值的数据框

scala - 处理内部隐式参数列表所需的显式参数

scala - 如何使用连接的 RDD

scala - 检查 2 个集合是否包含在 Scala 中

scala - 线程 # 将 _ GB 的排序数据溢出到磁盘

scala - 通用实体记录 scala - 引入无形状的 id 字段

scala - 为什么unapplySeq在模式匹配中涉及案例类或元组

scala - 如何在 Scala 中提前返回

scala - Spark Dataset聚合类似于RDD aggregate(zero)(accum, combiner)