daybreaksnow's diary

私を私と呼びたい

[Scala]Scala触ってみた 基本構文~関数まで

関数型言語の一つくらいは知っておきたいと思い、とっつきやすそうで流行ってるっぽいScala始めた。
以下の連載の5回目の途中まで読んだ。
http://www.atmarkit.co.jp/ait/kw/scala.html

覚えておきたいことメモ
・varで宣言すると変数、valで宣言すると定数。基本はval。MapとかListもデフォルトがImmutableで、Mutableなのはインポートが必要
・プリミティブ型がない。1+2は1.+(2) .は省略可能。引数がないか一つなら()も省略可能。
・'hoge のようにシングルクォートでシンボルリテラルを作れる。文字列と違い中身が同じなら必ず同一のオブジェクトになるらしい。Mapのキーに使うといいらしいが使い方要調査。
・フィールドのデフォルト値は_ 。初期化なしは許されない
・複数行コメントがネストできる。/* hoge /* piyo */ */
・for文でリストを回して新しいリストを作る例(元データの頭にfooが付いた文字列リストが作成される)

 val list = List("hoge","piyo")
  for(item <- list) yield{
   "foo" + item
  }

・代入文でtry~catchで書ける

 val result = try{
  num.toInt
 }catch{
  case e:NumberFormatException => {
   println("exception")
   -1
  }
 }

・関数に_を付けるとオブジェクトにできる

def add(a:Int,b:Int):Int = a+b
val result = add(1,2)
val func = add _
val result2 = func(1,2)
println(result + " " + result2)

・部分適用(引数の一部の値を固定して、関数を新しく作れる)

 val partAdd = add(_:Int,2)
 println(partAdd(1))

・Optionという型がある
map.get("hoge")で返ってくる。
キーに対応する値があればSome、
無ければNoneが返ってくる。
きっとnullチェックをなくすために使うのだろうと思われる。使い方要調査。

val map = Map("hoge"->1)
val value = map.get("piyo")
println(value.getOrElse("nothing")) //Noneなら指定の値
println(value.get) //Noneだと例外

None以外を回す例

val list = List(Some("start"),Some(1),None,Some(3),Some("end"))
for (Some(value) <- list){
  println(value)
}

・同一ファイル、同一パッケージ、同一名のクラスにprivateアクセスできるコンパニオンオブジェクトというのがある
使い方要調査

class Hoge private (num:Int){
}

object Hoge{
 //applyは特別な名前。newを使わずにインスタンス化可能?
 def apply(num:Int) = new Hoge(num)
}