sbtでプログラムをコンパイル・実行する
前節まででは、REPLを使ってScalaのプログラムを気軽に実行してみました。この節ではScalaのプログラムをsbtでコンパイルして実行する方法を学びましょう。まずはREPLの時と同様にHello, World!を表示するプログラムを作ってみましょう。その前に、REPLを抜けましょう。REPLを抜けるには、REPLから以下のように入力します1。
>:quit
Scala 2.10まではexit
、Scala 2.11以降はsys.exit
で終了することができますが、これらはREPL専用のコマンドではなく、今のプロセス自体を終了させる汎用的なメソッドなのでREPLを終了させる時には使用しないようにしましょう。
object HelloWorld {
def main(args: Array[String]): Unit = {
println("Hello, World!")
}
}
object
やdef
といった新しいキーワードが出てきましたね。これらの詳しい意味はあとで説明するので、ここでは、scalac
でコンパイルするプログラムはこのような形で定義するものと思ってください。{}
で囲まれている部分はREPLの場合と同じ、println("Hello, World!")
ですね。 これをHelloWorld.scalaという名前のファイルに保存します。
上記のプログラムはsbtでコンパイルし、実行することができます。ここではsandboxというディレクトリを作成し、そこにプログラムを置くことにしましょう。
sandbox
├── HelloWorld.scala
└── build.sbt
以上のようにファイルを置きます。
今回のbuild.sbtにはScalaのバージョンと一緒にscalac
の警告オプションも有効にしてみましょう。
// build.sbt
scalaVersion := "2.13.15"
scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-Xlint")
この記述を加えることでscalac
が
- 今後廃止の予定のAPIを利用している(
-deprecation
) - 明示的に使用を宣言しないといけない実験的な機能や注意しなければならない機能を利用している(
-feature
) - 型消去などでパターンマッチが有効に機能しない場合(
-unchecked
) - その他、望ましい書き方や落とし穴についての情報(
-Xlint
)
などの警告の情報を詳しく出してくれるようになります。コンパイラのメッセージが親切になるので付けるようにしましょう。
さて、このようにファイルを配置したらsandboxディレクトリに入り、sbtを起動します。sbtを起動するには対話シェルから以下のようにコマンドを打ちます。
$ sbt
するとsbtのプロンプトが出て、sbtのコマンドが入力できるようになります。今回はHelloWorldのプログラムを実行するためにrun
コマンドを入力してみましょう。
> run
[info] Compiling 1 Scala source to ...
[info] Running HelloWorld
Hello, World!
[success] Total time: 1 s, completed 2015/02/09 15:44:44
HelloWorldプログラムがコンパイルされ、さらに実行されてHello, World!
と表示されました。
run
コマンドではmain
メソッドを持っているオブジェクトを探して実行してくれます。
またsbtの管理下のScalaプログラムはconsole
コマンドでREPLから呼び出せるようになります。
HelloWorld.scalaと同じ場所にUser.scalaというファイルを作ってみましょう
// User.scala
class User(val name: String, val age: Int)
object User {
def printUser(user: User) = println(user.name + " " + user.age)
}
このUser.scalaにはUser
クラスとUser
オブジェクトがあり、User
オブジェクトにはUser
の情報を表示するprintUser
メソッドがあります(クラスやオブジェクトの詳細についてはこの後の節で説明します)。
sandbox
├── HelloWorld.scala
├── User.scala
└── build.sbt
この状態でsbt console
でREPLを起動すると、REPLでUser
クラスやUser
オブジェクトを利用することができます。
scala> val u = new User("dwango", 13)
u: User = User@20daebd4
scala> User.printUser(u)
dwango 13
今後の節では様々なサンプルコードが出てきますが、このようにsbtを使うと簡単に自分で試してみることができるので、活用してみてください。
1.:quit
ではなく:q
のみでも終了できます。 ↩