Septeni Engineer's Blog

セプテーニエンジニアが綴る技術ブログ

Scala初心者がScala学習に使っているREPL

Scalaを使い始めて、半年以上が過ぎてきました。 セプテーニ・オリジナル2年目の越です。 僕がScalaの学習をする時にREPLでいろいろ試すことが多いので、よく使っているものをまとめてみました。

ライブラリをREPL上で動かして試したいときなどに使っている機能をまとめてみました

Scalaのライブラリをちょっと試したい時などにREPLを使って試すときに僕がよく使っている機能です。

build.sbt
lazy val root = (project in file(".")).
  settings(
    name := "practice",
    version := "1.0",
    scalaVersion := "2.11.4"
  )

libraryDependencies ++= Seq(
  "joda-time" % "joda-time" % "2.9",
  "org.joda" % "joda-convert" % "1.8"
)
>sbt console
[:paste]を使って以下のスクリプトを入力してみる

*コンパニオンオブジェクトをREPL上で定義するときなどに使用しています(REPLではパッケージの入れ子構造のように定義されていくため)

> :paste
import org.joda.time.DateTime
import org.joda.time.format.DateTimeFormat

case class DT(dateTime: DateTime) {
  override def toString = dateTime.toString(DateTimeFormat.fullDate())

  lazy val year = dateTime.getYear()
  lazy val month = dateTime.getMonthOfYear()
  lazy val day = dateTime.getDayOfMonth()
  lazy val hour = dateTime.getHourOfDay()
  lazy val minute = dateTime.getMinuteOfHour()
  lazy val second = dateTime.getSecondOfMinute()
}

object DT {
   def now = DT(new DateTime()) 
}
出力結果

override def toStringをやっておくと、 applyしたときの初期出力を調整できたりします。

scala> DT.now
res1: DT = 2015年11月7日

途中までのREPL内の情報を残しておきたい場合[:save]

保存先のディレクトリを作成しておく

> mkdir snipet

REPL上で:saveを実行する。 *このときにres1にDT.nowの値いが入っている状態

scala> :save snipet/joda_datetime.scala

保存したREPLの情報を再読み込みする方法

scala> :load snipet/joda_datetime.scala
Loading snipet/joda_datetime.scala...
res1: DT = 2015年11月7日

保存しておくことで、あとで試したい時にも再定義が簡単に行えて便利です。