Scalaのcase classやコンパニオンオブジェクト、traitを勉強してみた!


Scalaのケースクラス(case class)やコンパニオンオブジェクト、トレイト(trait)などを勉強した際のメモです。

🎳 基本用語

キーワード 説明
構文(Syntax) プログラムが構造をもつためのルール(classif)
式(Expression) 評価すると値に変化するもの(1, 1+2, "hoge")
文(Statement) 式とは対象的に評価しても値にならないもの(val i = 1の全体)

🍣 ケースクラス

class定義の前にcaseをつけたクラスのことです。

case class Sample(num:Int)

インスタンスの生成:apply

applyはインスタンスを生成するためのメソッドです。applyは省略できます。

case class Dog(name: String, age: Int)

// コンストラクタに渡していた情報を引数に取る
val dog1 = Dog.apply("pochi", 4)

// applyは省略できるのでこう書ける
val dog2 = Dog("pochi", 4)

既存インスタンスからコピー:copy

copyは既存のインスタンスをベースに新しいインスタンスを生成するメソッドです。

case class Dog(name: String, age: Int)

val dog1 = Dog.apply("pochi", 4)

// name だけ異なるインスタンスを生成
val dog2 = dog1.copy(name="tora") //=> Dog(tora,4)

参照が等しいかの判定:equals==

equals==は2つのインスタンスの参照が等しいかを判定するメソッドです。

case class Dog(name: String, age: Int)

val dog1 = Dog.apply("pochi", 4)
val dog2 = dog1.copy()
val dog3 = Dog.apply("tora", 4)

dog1 == dog2 //=> true
dog1 == dog3 //=> false

🏈 コンパニオンオブジェクト

クラス名と同じ名前をつけたシングルトンのオブジェクトのことです。同名のクラスのprivateメンバにアクセスでき、共通の処理、操作を扱います。

class Dog(id: Int, name: String){
val decorated_name: String = name + "様"
}

// ファクトリメソッド的な使い方
object Dog {
val default_id = 1000

def apply(name):Person = {
new Dog(default_id, name)
}

def findByName(name):Person = {
// do something
}
}

コンパニオンオブジェクトの目的は次のとおりです。

  • applyを用いたファクトリメソッド
  • unapply(インスタンスの構成要素を抽出するためのメソッド)でパターンマッチをできるように
  • staticな関数、定数の置き場所
  • implicitの解決先(型クラスの定義や暗黙の型変換)

🐯 トレイト(trait)

トレイト(trait)はScalaのオブジェクト指向のモジュール化の中心的な概念。traitは実装を追加できるインターフェイス。クラスの構造を構築するのに使われる。

class Dragon(n: String) {
val name = n
}

trait Flyable {
def fly: String = "飛べ"
}

class FlyingDragon(name: String) extends Dragon(name) with Flyable
new FlyingDragon("コモド・ドラゴン").fly //=> String = 飛べ

traitの特徴

  • 複数のトレイトを1つのクラスやトレイトにミックスインできる => 多重継承的なことができる
  • 直接インスタンス化できない(クラスではない、コンストラクタの引数はとれない)

🐠 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍