まーぽんって誰がつけたの?

iOS→Scala→インフラなおじさん技術メモ

Scalaやったことないけど始めてみたいと思ってる人へのオススメ環境作り

とりあえずScalaをhomebrewとかでインストールすればREPLで実行できるけど、やっぱりIDEとか使った方がやりやすいです。その環境を作るのも結構簡単なのでそれを紹介。僕も始めて2ヶ月ぐらいなので、これからScalaに入門してみたいって人向けの記事です。

Intellij IDEAさえあれば始められるのでやってみてください!

IDE(Intellij IDEA)の設定

  • Intellij IDEAをインストールする
  • Intellij IDEA起動して起動メニューでConfigure > Plugins > Browse Repositories...
  • scalaって入力してScalaSBTをInstallして再起動

f:id:masato47744:20140924212253p:plain

プロジェクトを作る

  • 起動メニューでCreate New ProjectでScala > SBTを選択してプロジェクトを作成

f:id:masato47744:20140924212542p:plain

  • 作成されたプロジェクトが開くけどIntellijがプロジェクトを構成してくれるまで2,3分待つ
  • 右下のタスク実行中の途中経過の表示が終わったらsrcディレクトリとかできてこんな画面になる

f:id:masato47744:20140924212739p:plain

エントリポイントとなるコード作成

  • Javaでいうmain関数となるところ
  • src/scala配下にNew > Scala ClassでKindはObjectにしてApplication.scalaを作成する
  • 以下のようなコードを書く。extends Appがポイント
  • 実行時の引数はargsで配列形式でとれる
object Application extends App {
  if (args.length > 0) {
    println("Hello world" + args(0))
  } else {
    println("Hello world")
  }

}

SBT経由でアプリケーションを実行

  • 左下のSBT Consoleを開いてStart SBTの再生ボタンを押す
  • 何やらコンソールに色々表示されて入力待ち状態になる
  • runと打つと引数なしで実行 。実行時に引数も渡せる

f:id:masato47744:20140924213907p:plain

ちょと応用編: grep処理を書く

import scala.io.Source
import java.io.File

object Application extends App {
  args.headOption.map { pattern =>
    val file = new File("src/main/scala/Application.scala")
    val source = Source.fromFile(file)
    source.getLines()
      .zipWithIndex
      .filter(x => x._1.matches(s".*$pattern.*"))
      .map(x => (x._1.trim, x._2 + 1))
      .foreach(x => println(s"${x._2}: ${x._1}"))
    
    source.close()
  } getOrElse {
    println("usage: run pattern")
  }
}
  • args.headOption.mapは第1引数があればというような意味。下の方のgetOrElseがなかった場合の処理
  • Optionという概念はScalaの特徴的なやつ。便利なことは後々分かってくるはずなので最初はスルーでもOK
  • source.getLines()でファイルを1行ずつ読み込む
  • .zipWithIndexで(1行ごとの文字列, 0始まりのindex)というタプルがとれる
  • タプルの1番目は ._1、タプルの2番目は._2でとれる
  • .filterJavaのパターンマッチで引っかかったやつだけを返す
  • .mapでfilterした内容について変換(文字列はトリム、indexは行番号にするために+1)を適用してそれを返す
  • .foreachは今まで処理した結果を標準出力に表示
  • これで、run fileとか実行すればgrep内容が出力されます

まとめ

とりあえずこんな感じでScalaを始められます!
上のgrep処理はApplication.scalagrepしてるだけだけど、カレントディレクトリ配下のファイル全てをgrepするとかやってみたりしてるうちにScalaのことが少しずつ分かってくると思います。 それぞれの言葉は分からなくてもとりあえず触ってみると楽しいです。