いい一日はいい睡眠から いい睡眠はいい一日から

読んだ記事のあれこれを書いていきます

2020/03/19

  • 病院 o
  • 彼岸 o
  • 保険 o
  • 英単語10words x
  • リスニング o
  • Scala o

Scala

ケースクラス

ケースクラスは不変なデータを作るのに適している.
ケースクラスをインスタンス化する際にキーワードnewが使われていない.これはcaseapplyメソッドを標準で持っているため.ケースクラスのパラメータはパブリックのvalとなるため,再代入はできない(varも使うことはできるが非推奨).ケースオブジェクトも存在.ケースクラスと同様の性質を持つ.

同値性

そのオブジェクトの中身が同じものであるかどうかを判断する性質.ケースクラスはequalのようなメソッドを使わなくとも良い.単純なclassから生成されたインスタンスのオブジェクトの中身を==によって比較できるようにするにはequalsメソッドをovarrideするなどをして実現することができる.

sealed

宣言されたファイルの中でしか利用することができないクラスであることを表すキーワード.enumの代わりに使用されるとのこと.

qiita.com

トレイト

クラスに対して振る舞いを追加するために使われる.

自分型アノテーション

クラスやトレイトの中で自分自身の型にアノテーションを記述することができる機能.
抽象トレイトを指定し,後から実装を追加する.

trait Greeter {
  def greet(): Unit = {
    println("Hi!")
  }
}

trait Person {
  self: Greeter => // ここの部分が自分型アノテーション

  def meet(): Unit = greet()
  override final def toString = "Person"
}

これは,ミックスインされて初めて利用できるようになる.上記のコードではextends Greeterとしていないがエラーは出ないことに注目.
この状態では,

val p: Person = new Person with Greeter
p.meet() // "Hi!"
p.greet() // ERROR

となる.Personはgreet()を持っているわけではない.
意味がわからなかったのが自分型は型の循環参照を許すというところ.もう少し調べる必要がありそう.