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

objectdefといった新しいキーワードが出てきましたね。これらの詳しい意味はあとで説明するので、ここでは、scalacでコンパイルするプログラムはこのような形で定義するものと思ってください。{}で囲まれている部分はREPLの場合と同じ、println("Hello, World!") ですね。 これをHelloWorld.scalaという名前のファイルに保存します。

上記のプログラムはsbtでコンパイルし、実行することができます。ここではsandboxというディレクトリを作成し、そこにプログラムを置くことにしましょう。

sandbox
├── HelloWorld.scala
└── build.sbt

以上のようにファイルを置きます。

今回のbuild.sbtにはScalaのバージョンと一緒にscalacの警告オプションも有効にしてみましょう。

// build.sbt
scalaVersion := "2.12.1"

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のみでも終了できます。

results matching ""

    No results matching ""