2016-06-25 22 views
0

this bookでScalaを学習していて、例を実行しようとした後にエラーが発生しました。コード:コマンドラインから実行したときにscala - パッケージが見つかりません

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 + ")" 
    } 
} 

形状-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) 
     } 
     } 
    } 
    } 
} 

形状-アクター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ファイルにクラスをコンパイルしますが、2番目のコマンドでエラーが発生します:

/Users/simon/Documents/playground/code-examples/Introdu 
cingScala/shapes-actor-script.scala:3: error: not found 
: value shapes 
import shapes._ 
    ^
... 

プログラムのコンパイルや実行に何か問題がありますか?

答えて

0

あなたはPythonのようにScalaを扱っているようです。残念ながらそれは動作しません。あなたは何を誤解していると思いますか?

% scala -cp . shapes shapes-actor-script.scala 

を意味します。あなたは少なくともOS X 10.11.5でそのコマンドを実行してください。 Scala 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) 

我々はexecの構文を台無しにしましたので、それはshapesを見つけることができない文句。構文はscala -cp PATHS CLASSであることを覚えておいてください。シェルはPATHSを1つの引数として扱います。したがって、上記のコマンドは、Scalaにクラス名のメインメソッドを実行するように指示しています(shapes)。

これを修正するには、:を使用してコマンドを修正し、パスを結合します。 1)Scalaは再帰的に指定したすべてのディレクトリのすべてのクラスファイルをロードするために起こっている - :

% 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 

問題が二つある。このようなクラスパスで。そこで、各ファイルをダブルロードしています。 - 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... 

それは働きます!

実際には、このスクリプトを呼び出すための2つの方法もあります。 Scalaのコマンドは、デフォルトで.からクラスファイルを探しますので、我々は書かれている可能性があり:

% scala shapes-actor-script.scala 

あなたは真のスクリプトとしてshapes-actor-script.scalaを実行する場合は、最も簡単な方法は、見出しの下に、ここでの指示に従うことですScript it!。ただ、追加:

#!/bin/sh 
exec scala "$0" "[email protected]" 
!# 
...rest of shapes-actor-script.scala 

あなたは、それはあなたが他のスクリプトと同じように、コマンドラインで実行(ファイルが実行可能であることを確認してください!):

運学習スカラ座の
% ./shapes-actor-script.scala 

ベスト!

関連する問題