Scala 2/3 の列挙型と既存の型へのフィールドの追加

scala

Scala 2

Scala 2 には Java のような enum は存在せず Enumeration や case object が用いられる。 また、implicit class を import することで既存の型へフィールドを追加することができる。

sealed trait Animal

object Animal {
  case object Dog extends Animal
  case object Cat extends Animal
}

object Converter {
  implicit class AnimalConverter(animal: Animal) {
    def hello() = animal match {
      case Animal.Dog => "wan!"
      case Animal.Cat => "nya!"
    }
  }
}

import Converter.AnimalConverter

object App {
  def main() = {
    print(Animal.Cat.hello) // nya!
  }
}

Scala 3

Scala 3 で enumextension が追加されたことにより次のように書けるようになった。

enum Animal:
  case Dog, Cat

extension (animal: Animal) {
  def hello() = animal match {
    case Animal.Dog => "wan!"
    case Animal.Cat => "nya!"
  }
}

object App {
  def main() = {
    print(Animal.Cat.hello()) // nya!
  }
}