Scalaのエントリポイント(def main
)についてよくわからず機械的にコピペしていたので、ふと思い立って仕様を調べてみた。
言語仕様
Top-Level Definitions | Scala 2.12
翻訳
9.5 プログラム
プログラム とは (Array[String])Unit
型の main メンバーメソッドを持つトップレベルオブジェクトである。
プログラムはコマンドシェルから実行可能である。
このプログラムのコマンド引数は main メソッドへ Array[String]
型のパラメータとして渡される。
プログラムのこの main メソッドはオブジェクト内で直接定義することもできるが、継承することもできる。
scalaライブラリが定義する特殊なクラス scala.App のボディは main メソッドと同様に機能する。
このクラスを継承するオブジェクト m
は、それ故オブジェクト m
の初期化コードを実行するプログラムである。
例
以下の例は test.HelloWorldモジュール内で main メソッドを定義することにより hello world プログラムを作成している。
package test
object HelloWorld {
def main(args: Array[String]) { println("Hello World") }
}
このプログラムはこのコマンドで開始できる
scala test.HelloWorld
Java環境では、このコマンドでも動くだろう。
java test.HelloWorld
HelloWorld は App を継承することで main
メソッドなしに定義することもできる:
package test
object HelloWorld extends App {
println("Hello World")
}
わかったこと
- いつの間にかScalaの言語仕様はすごくアクセスしやすくなっていた
- 引数の型として
Seq[String]
などは依然使えない - Appはほとんど使われなくなったよう感じるがまだ仕様としては残っている