LL脳がscalaの勉強を始めたよ その5
第4章の前半 Scalaのクラスについて
2章で軽く触れたScalaのクラスやオブジェクトについて掘り下げる感じで
身についてるのが、正直独学(≒いんちき)オブジェクト指向なので、すこしでも取り戻そうかと…
後半のコンパニオンオブジェクト絡みの部分はまたあとで…酒飲みながらDjangoと戯れてたら咀嚼する時間がなくなってしまったのデス ...orz
クラスの書き方
Scalaでのクラスの書き方をざくっと
// クラス定義 class hoge { // フィールドと呼ぶ、いわゆるクラス変数 var moge = 2 // プライベートにする場合はこう private var huga = 3 // メソッドは、まあこんな感じ // 変数hugaに値を追加して良く処理 def add(i: Int): Unit ={ huga += i } // もう一つメソッドを書いてみる // 変数hugaとmogeの席を返す処理 def multiple(): Int = { return huga * moge } }
また、フィールドやメソッドをメンバーと呼ぶ
オブジェクトを生成するにはnewする
val h = new hoge()
フィールドの話
immutable定義のオブジェクトでもフィールドがvarで定義されていれば最代入化ですよー
// immutableな変数にオブジェクトを格納 val h = new hoge() // クラス内でvar定義なのでこのフィールドはmutable h.moge = 5 // これはエラー: 外部から変更されたくなければprivateで定義する h.huga = 5
メソッドの話
メソッドがらみの内容は結構盛りだくさんなので箇条書きにまとめてみる
- メソッドの引数はval定義
- 変更されていないことを保証するため
- Unit型のメソッドは結果を返さない、仮にreturnがあっても無視する
- Unit型は = を省略可能
- 逆に=が省略されているメソッドはUnit型とすると見通しがよくなる
- =省略時は必ず{ }が必要(ワンライナー風のときも)
- Unit型以外のメソッドではreturnは省略可能
- 返されるのは最終計算結果
- 戻りの型は検査されるので合わせる必要あり(型推論の利用可)
- ブロック範囲が明確であれば{}を省略できる
- メソッドの処理が短ければ改行を省略してワンライナー風にも書ける
…ということを使って、最初に定義したhogeクラスを単純化してみる
class hoge { var moge = 2 private var huga = 3 def add(i: Int) { huga += i } def multiple() = huga * moge }
ついでにメソッドのprivate化は次のように行うみたいね
private def add(i: Int) { huga += i }
おまけ
ブロック範囲が明確であれば{}を省略できる
ってのがどこまで可能か間違った方向に突っ走ってこけてみた。そりゃPythonとは違うよな...
def hoge(i: Int):Int = // ここまで計算した結果をreturn i * 5 // ここはhogeメソッドの範囲外として判定 i * 9
行末記号;の省略
セミコロン行末は省略できるよ、使ってもいいけどね、って話
// 省略するよー if ( x < 3 ) println(x) else println(0) // 無理やり押し込んでワンライナーっぽく val hoge = "huga";println(hoge)
ちなみにこんなのはだめ、xと+yという処理が別行として解釈される
x +y
()で囲んでブロック化するか、これならOK
x + y
そんなわけでScalaでは演算子を右に書く文化なの…とのこと
ちなみにscalaが文末を;として扱うのは次の3条件にあてはまらない場合になる
- 文末にピリオドや演算子などの文法的に認められていない文字がきている場合
- 次の行の頭に、行頭で使えない文字がきている場合
- ()や[]の中での文末