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

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

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

# Scala IDEをインストール
[Mac 用では Eclipse とセットにしたものを配っている](http://scala-ide.org/download/sdk.html)ので、それを使えばよいでしょう。あるいは、単に学習目的であれば [Ideone](https://ideone.com/) 等のオンラインコンパイラで 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字です。

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

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

# 変数の定義
| 定数(immutable) | val 変数名: 型名 = 値
|:---|:---|
| 変数(mutable)   | var 変数名: 型名 = 値

# 配列

```scala: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 を使って初期化している
1. Array は Java の配列とは異なり contains が使える

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

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

```scala: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から目線)
1. foreach が全部小文字(Javaから目線)
1. メソッドの引数は val 扱い、なので再代入不可

### メソッドの書き方

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

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

## まず if-elseで書いてみる

```scala: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 というものがあるそうなので、それを試してみます。

```scala: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行で書いてしまえば同じようになるので、今ひとつありがたみがわかりにくいかもしれないです。