hamayuzinの日記

エンジニアとかデータサイエンティストとかやってます。あの時 あれやってたな的な備忘録にできれば。

【scala入門】rubyエンジニアがscalaを勉強したメモ その3

case class

  • 特徴
    • メンバーフィールドの公開
    • toString の実装
    • new の代わりのファクトリメソッド
    • データの構造を表現するのに非常に便利な機能
    • 異なるインスタンスでも、内部のフィールドが同じであればイコールになる

sealed class

  • 宣言したファイル内でしか使えない

パッケージオブジェクト

  • パッケージ自体と同じ名前を持つオブジェクト
  • 同じパッケージ内では import 文を利用することなしに、定義したメソッドを呼び出すことができる

trait

  • トレイトを継承することをミックスイン
  • クラスの継承については、ミックスインと呼ばない
  • 特徴
    • クラスパラメーター (コンストラクタ引数) を取ることができない
    • 直接インスタンス化できない
    • 複数のトレイトを 1 つのクラスやトレイトにミックスインできる
    • abstract class キーワードで宣言できる抽象クラスに似ていますが、ひとつのクラスに複数ミックスインできるというところが異なる
  • クラスは複数継承できないが、traitはできる
  • 多重継承による菱型継承問題
    • 解決方法
      • かぶってるmethodを override する
      • super[TraitB].greet() 指定してしまう
    • 線形化(linearization)
      • 継承もとのそれぞれで、かぶっているmethodをoverrideする
      • すると extends ClassA with TraitB with TraitC)だと、一番後ろのものが評価される
  • 自分型アノテーション(self type annotations
    • self: TraitB => みたいなやつ
    • 後からnew するときに、withで対象のtraitをいれる
    • インスタンス生成時に、依存性を選択できるイメージ
  • Scala のクラスおよびトレイトはスーパークラスから順番に初期化される