#navi_header|Scala| Scalaを実行する色々な(といっても2種類だけど)方法。 * 対話型インタプリタから実行 + 基本なので省略。 + ''但し対話型インタプリタ上(正確にはREPL:Read Eval Print Loop)からの場合、中でpackage宣言は出来ません。'' "illegal start of definition" が発生します。な、なんだってー!! * スクリプトとして実行 シェバン行指定については調べてません。 (適当なディレクトリ1)/run_by_script.scala: args.foreach(println) 実行:(適当なディレクトリ2)に移動してscalaコマンドでファイル名指定。 > scala (適当なディレクトリ1)/run_by_script.scala abc def abc def ポイント: + スクリプトファイル名と、中で宣言するクラスは無関係。いくらでもクラス宣言可能。 + ''但しスクリプトファイルの場合、中でpackage宣言は出来ません。'' "illegal start of definition" が発生します。な、なんだってー!! * コンパイルして実行 (適当なディレクトリ1)/hello.scala: class c1 class c2 object main { def main(args:Array[String]) { for (i <- 0 to args.length - 1) println("args(" + i + ") = " + args(i)) } } "適当なディレクトリ2"に移動してコンパイル > scalac (適当なディレクトリ1)/hello.scala → "適当なディレクトリ2" の下にクラスファイル(.class)が生成される。("-d" で出力先ディレクトリを指定できます。) "適当なディレクトリ2"に移動してコンパイルしたクラスファイルを実行 > scala main abc def args(0) = abc args(1) = def ポイント: + ソースファイル名と中のクラス名を一致させる必要はありません。 + ちなみに、あくまでもscalaはコンパイルして実行するタイプの言語ですので、Perl/Python/Ruby/PHPみたいにソースファイルを実行時に取り込んで実行する機能は多分ありません。importはありますがあくまでもコンパイル済みの.classファイルを参照するのみ。 こういう機能はない・・・多分。 foo.scala: ... import "abc/sub1.scala" ... * コンパイルして実行(package宣言有り) (適当なディレクトリ1)/package1.scala: #pre||> package foo { class c1 } package foo.bar { class c2 } package foo.bar.baz { object main { def main(args:Array[String]) { args.foreach(println) } } } ||< "適当なディレクトリ2"に移動してコンパイル > scalac (適当なディレクトリ1)/package1.scala → "適当なディレクトリ2"の下に以下の構成でclassファイルが生成される。 foo/c1.class foo/bar/c2.class foo/bar/baz/main.class, main$.class, ... "適当なディレクトリ2"の外からコンパイルしたクラスファイルを実行 > scala -cp 適当なディレクトリ2 foo.bar.baz.main abc def abc def ポイント: + ソースファイル・ソースのディレクトリ構成と、パッケージ名・クラス名は別々に付けられます。 + 但し生成されるクラスファイルの構成は、パッケージ名とクラス名に従います。 #navi_footer|Scala|