S-JIS[2010-10-23/2013-06-08] 変更履歴
Scalaでは、scalaコマンドによってクラスを実行する他に、対話型インタープリターとしてコマンドを入力して実行することが出来る。
|
|
REPLとは、コマンドラインからコマンド(Scalaの命令)を入力して、その場でインタープリターが解釈して実行してくれるもの。
ちょっとしたクラス・メソッドを試したい時に重宝する。
(Read=コマンド読み込み、Eval=解釈・実行、Print=結果表示、Loop=それらを繰り返す)
引数なしでscalaコマンドを実行すると、REPL(インタープリター)が起動する。
> scala Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Client VM, Java 1.6.0_22). Type in expressions to have them evaluated. Type :help for more information. scala>
「:help
」と入れると、ヘルプが表示される。
「exit
」で終了できるが、ヘルプを見る限りでは、「:quit
」が正式な終了方法かな?
(exitはREPLのコマンドではなく、Scalaの関数)
(「:q
」や「:qu
」でも終われるようだが、「:h
」はエラーになるが「:he
」でヘルプが表示されるので、他のコマンドと区別がつく範囲では省略できるのかも)
コマンド | 説明 | 例 | ||
---|---|---|---|---|
:cp |
クラスパスにjarファイルもしくはディレクトリーを追加する。 | |||
:help |
ヘルプを表示する。 | |||
:history |
コマンド履歴(今までに入力したコマンド)を表示する。 | :his 10 |
直近10行分のコマンド履歴を表示する。 | |
:h? |
コマンド履歴を検索する。 | :h? zzz |
履歴の中で「zzz」が含まれているコマンドを表示する。 | |
:imports |
2.9〜 | インポートした履歴を表示する。[2011-09-18] | :imports |
|
:implicits |
2.9〜 | インポートされている暗黙変換を表示する。[2011-09-18] REPLのトップレベルで自分で定義した暗黙変換は表示されない模様。 object内に定義してimportすれば表示される。by xuwei-kさん |
:implicits -v |
Predefで定義されている暗黙変換が表示される。 |
:javap |
2.9〜 | クラスの情報を表示する。[2011-09-18] | case class A(n:Int) |
コンパニオンオブジェクトも指定可能。 |
:javap java.lang.String |
既存クラスも指定可能。 | |||
:keybindings |
2.9 | キーに割り当てられている内容を表示する。[2011-09-18] -Xnojlineを付けてREPLを起動している場合は無効。 |
:keybindings |
|
:load |
scalaファイルをロードする。 | |||
:paste |
2.9〜 | 複数行(複数の式)をまとめて入力できる。[2011-08-26] | :paste |
Ctrl+Dで入力を終了する。 (-Xnojlineを付けてREPLを起動していた場合はCtrl+Zで終了) |
:power |
パワーユーザーモードを使えるようにする。 | |||
:quit |
REPLを終了する。 | |||
:replay |
直前のScalaの命令(メソッド呼び出し)を再実行する。 | |||
:reset |
2.10 | それまでに入力された内容(変数の値やクラス・関数定義など)をクリアする。[2013-06-08] | ||
:sh |
OSコマンドを実行する。 Scala2.9からは結果の取得方法が変わった。[2011-09-18] |
:sh dir |
→使用例 | |
:silent |
結果の表示有無を切り替える。 | →使用例 | ||
:type |
2.9〜 | 評価(式の実行)をせず、結果の型を表示する。[2011-09-18] | :type 123 |
|
:warnings |
2.10 | 直近に出た警告の内容を表示する。[2013-06-08] 何らかの演算を実行して 「warning: there were 1 feature warning(s); re-run with -feature for details」 というメッセージが出た場合、「 :warning 」を実行すると詳細な警告内容が表示される。 |
:warn |
|
:completions |
〜2.8 | パワーモードで使用可能。[2010-12-30] 指定したオブジェクトのメソッド一覧が取得できるようだ。 |
:comp "abc" |
|
:dump |
〜2.9 | パワーモードで使用可能。[2010-12-30] 現在のREPL内で定義されている名前(識別子)の一覧が表示される。 |
:dump |
|
:phase |
2.9〜 | パワーモードで使用可能。[2011-09-18] | ||
:wrap |
2.9 | パワーモードで使用可能。[2011-09-18] REPLの式をラップして、独自処理を実行できる。 |
→xuweiさんのScala2.9.0のREPLで、すごく便利な裏技を発見した件 |
REPLで組み込まれているコマンド以外のものを入力すると、Scalaの命令として解釈・評価(実行)される。
まずは定数(数値や文字列)を入力すると、そのまま表示される。
scala> 123 res0: Int = 123 scala> "abc" res1: java.lang.String = abc
「res0」「res1」は、命令を実行した結果が格納される変数。REPL内で暗黙に定義されるようだ。
実行する度に番号は増えていく。(先回りして大き目の番号を使った変数を使っておくと、その分はちゃんとスキップされる)
「res0: Int = 123
」は、変数res0は型がIntで値が123であることを示す。
res0等は変数なので、その内容を表示したり演算に使ったりすることが出来る。
scala> res0 res2: Int = 123 scala> res0 + res1 res3: java.lang.String = 123abc
「:silent
」を実行すると、実行結果が表示されなくなる。
scala> :silent Switched off result printing. scala> 456 scala> :silent Switched on result printing. scala> 456 res5: Int = 456
REPLでシェル(DOSやUNIX)のコマンドを実行する例。[2011-09-18]
Scala2.8では、実行結果(標準出力への出力内容)はstdoutという変数(型はList[String]
)に入る。
scala> :sh dir "C:\" stdout: List[String] = List( ドライブ C のボリューム ラベルがありません。, ボリューム シリアル番号は〜, , C:\ のディレクトリ〜 scala> stdout.mkString("\n") res1: String = ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は〜 C:\ のディレクトリ 〜
Scala2.9では、Windowsの(DOSの)組込コマンドは実行できなくなった。cmd.exe経由で実行する。
実行結果はProcessResultというクラスで返ってくる。
scala> :sh cmd /c dir C:\ res2: scala.tools.nsc.interpreter.ProcessResult = `cmd /c dir C:\` (81 lines, exit 0) scala> res2.show ドライブ C のボリューム ラベルがありません。 ボリューム シリアル番号は〜 C:\ のディレクトリ 〜
メソッド名 | 備考 | 例 |
---|---|---|
line | 実行したコマンドラインが返る。 | cmd /c dir C:\ |
exitCode | 実行したコマンドの戻り値が返る。 | 0 |
lines | 実行結果(標準出力/標準エラーへの出力内容)をList[String] で返す。(Scala2.8での結果取得方法と同様) |
|
show | 実行結果を表示する。 「 .lines.foreach(println) 」と同様。 |
また、ProcessResultからList[String]
への暗黙変換が定義されているので、Listのメソッドを直接指定することも出来る。
scala> res2.mkString("\n")
コンパイルされたScalaのクラスを実行する方法は、Javaにおけるjavaコマンドの実行と同様。
>scala クラス名
また、Scalaのスクリプトファイルを実行することも出来る。
>scala スクリプトファイル名
スクリプトファイルは、REPLで実行できるScalaの命令を書いたファイル。
拡張子は「.scala」にするので、Scalaのソースファイルと同じ。
スクリプトファイルの場合、暗黙の配列変数argsが定義され、実行時の引数が格納される。
println(args.length) for(arg <- args){ println(arg) }
C:\temp\scala>scala sample_script.scala aa bb cc
3
aa
bb
cc
scalaコマンドの起動時のオプションについて。[2010-12-12]
オプション | 説明 |
---|---|
-help | オプション一覧を表示する…ところだと思うのだが、scalacのオプションは全部使えるのでそちらも見ろ、ということらしい。 「scalac -help」を参照。 |
-X | 拡張オプションの一覧を表示する。 |
-Xnojline | REPLで日本語入力が出来るようになる。 ただしタブキーによる補完が出来なくなる模様。 (そもそもはJLineを無効にするオプションらしい。が、JLineって何ぞ?) |
-i ファイル | REPL起動時に最初にファイル(スクリプトファイル等)を実行する。[2011-09-30] Scala2.9.1〜2.9.2ではバグっていて使えない(ファイルを読み込もうとして固まる。SI-4945)。 |
-Yrepl-sync | Scala2.9.1〜2.9.2で「-i」を使う際に一緒に指定すると、スクリプトファイルが実行できる。[2012-09-02] |