LoginSignup
3
2

More than 5 years have passed since last update.

Scala 初心者の独り相撲初場所 初日

Posted at

概要

今まで Java でしか開発をしたことのないプログラマーが Scala で開発することになりそうなので、勉強を始めました。

諸注意

日付は実際の営業日を示します。大相撲の本場所は15日目までありますが、いつまで続くかはわかりません。千秋楽(15日目)までに終わるかもわかりません。

Scala IDEをインストール

Mac 用では Eclipse とセットにしたものを配っているので、それを使えばよいでしょう。あるいは、単に学習目的であれば Ideone 等のオンラインコンパイラで Web ブラウザから実行してもよいかもしれません。

下記は適宜実施してください。

  1. プロジェクト作成
  2. クラス作成

日本語化

Pleiades プラグインをダウンロードして、Scala IDE の plugins フォルダに置き、「eclipse」の「パッケージの内容を編集」を実行、その中にあるMacOSフォルダの「eclipse.ini」に下記1行を追記して再起動します。

-javaagent:../../../plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

Scala 関連はほぼ日本語化されませんが、仕方ありません。

コード補完が効かない?

単にショートカットが Control キーになっているのに Command キーを押していたからでした。
「Scala IDE」→「環境設定」→「一般」→「キー」→「コンテンツ・アシスト」を「Command+Space」に変更します。

Hello world する

Scala のインデントは半角スペース2字です。

Hello_world
object HelloWorld {
  def main(args: Array[String]) {
    println("Hello world.")
  }
}

書いてみて思ったこと

  1. object……Singleton オブジェクトの定義、Scala は Singleton を言語レベルでサポート
  2. 「変数名: 型名」で宣言(Java と逆)
  3. 標準出力は println で可能…… Groovy もそうなので、そうできない Java がちょっと残念(なお Groovy は括弧でくくる必要すらない)
  4. セミコロンはあってもなくてもよい……だったらあってもいいのでは
  5. main……これがあるクラスは Main として認識される。なお Scala に static の概念はないという
  6. Array……配列が特例ではないクラスで定義されている?

変数の定義

定数(immutable) val 変数名: 型名 = 値
変数(mutable) var 変数名: 型名 = 値

配列

Arrayの例
object ArraySample {
  def main(args: Array[String]) {
    val items: Array[String] = Array[String]("apple", "bacon", "cheeze")
    if (items.contains("onion")) {
        println("Array has onion,");
    } else {
        println("Array doesn't have onion,");
    }
  }
}

書いてみて思ったこと

  1. Array は new ではなく factory method を使って初期化している
  2. Array は Java の配列とは異なり contains が使える

Range

Range
object RangeSample {
  def main(args: Array[String]) {
    val items: Range = Range.apply(0, 100)// 0 から 99
    items.foreach { it => println(it) }
  }
}

Filter & ForEach

ここで初めてメソッドを使ってみます。

Filter&ForEach
object ClosureSample {
  def main(args: Array[String]) {
    val items: Range = Range.apply(1, 100)
    items.filter  { it => isEven(it)  }
         .foreach { it => println(it) }
  }
  def isEven(i: Int): Boolean = {
    return i % 2 == 0;
  }
}

書いてみて思ったこと

  1. Stream API と使い勝手はほぼ同じなので特に何もない(Javaから目線)
  2. foreach が全部小文字(Javaから目線)
  3. メソッドの引数は val 扱い、なので再代入不可

メソッドの書き方

FizzBuzz
def メソッド名(引数名: 型名): 戻り値型 = {
  return i % 2 == 0;
}

FizzBuzz

番数も取り進みましたるところ、かたや、 if-else, if-else, こなた、 Pattern match, Pattern match, この相撲一番にて本日の、打ち止め

まず if-elseで書いてみる

FizzBuzz_if_else
object FizzBuzzSample {
  def main(args: Array[String]) {
    val items: Range = Range.apply(1, 100)
    items.foreach { it => fizzBuzz(it) }
  }
  def fizzBuzz(i: Int) {
    if (i != 1) {
      print(", ")
    }
    if (i % 15 == 0) {
      print("fizzbuzz")
    } else if (i % 3 == 0) {
      print("fizz")
    } else if (i % 5 == 0) {
      print("buzz")
    } else {
      print(i)
    }
  }
}

Pattern match

Scala には Pattern match というものがあるそうなので、それを試してみます。

FizzBuzz_pattern_match
object FizzBuzzSample {
  def main(args: Array[String]) {
    val items: Range = Range.apply(1, 100)
    items.foreach { it => fizzBuzz(it) }
  }
  def fizzBuzz(i: Int) {
    if (i != 1) {
      print(", ")
    }
    i.match {
      case i if (i % 15 == 0) =>  print("fizzbuzz")
      case i if (i %  3 == 0) =>  print("fizz")
      case i if (i %  5 == 0) =>  print("buzz")
      case _                  =>  print(i)
    }
  }
}

なにこれすごい……というほどでもないでしょうか?今回のケースでは、前の例でも if-else 文を1行で書いてしまえば同じようになるので、今ひとつありがたみがわかりにくいかもしれないです。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2