menu
書いてる野郎
orebike@gmail.com
Scala 2.8 かららしいが名前付き引数が使える。これは非常に嬉しい
def myadd(a:Int, b:Int):Int = { a + b } println(myadd(b = 12, a = 23))
みたいに仮引数の変数名でパラメータを渡せるので、順番間違いによるミスを減らせる。
Scala には処理の評価を抑制してオブジェクトとして扱う記法がある。それをなぜか「名前渡し」と言うっぽい。
関数の引数として処理を直接リテラル表記した場合に評価されて駆動することを抑制する必要が出てくるので、基本的にこの記法を使う。
つまり途中で値を return して抜けたい。
単純に
return hoge
すればよい。
しかし型推論機構がある Scala にとってはこれは若干の問題を含む。 リターンする型を推論で決定できなくなることを意味する。
そこで Scala では return を用いた場合関数の戻り値の型まで明記しなければいけないという縛りが入ることになっている。 通常ならば関数の一番最後で評価された値が返るので自動的にその型になるのだが出口が2個になるからどっちなのってこと。
しかしそもそも Scala は途中で return しないのが作法のようだ。 状況によって返すものを変えたい場合は、その状況判断と処理分岐を分離するという作法をとる。
状況を決定してから、最後に Scala 得意の match 構文で case 分岐して評価値を決定する。
思想として Scala は関数ベースなので関数にとって return は処理の中断ではなく値の返却を意味している。つまり関数とは値の返却、言い換えれば値そのものを表していて、処理の塊ではないということだ。
途中で戻すということは、処理の副作用が重要なことを表していて、副作用を嫌う関数型言語と相性が悪い。
デフォルト引数を設定していないと、基本的に呼び出すことすらできない
def hoge(a:Int) = 123 + a hoge(456) //これはOK hoge() //これはできない
def hoge(a:Int = 0) = 123 + a hoge(456) //これはOK hoge() //これもOK
def hoge() = 123 + 456 hoge(456) //これはだめ hoge() //これはOK
これは Scala の変数は必ず初期化とセットという仕様に起因しているのだろう。 JavaScript のようにとりあえず呼び出しておいて引数の内容によって自在に挙動を変えるようなロジックを組むことができない。
Scala の関数の引数変数は val 宣言で作られた変数と同様に動作する。 つまり引数は関数内で書き換えることができない。