Search code examples
scalaenumsscala-3

What's the final version of Scala3's enum syntax?


I want to override method in enum class, something as the following example mentioned in Add enum construct

enum class Option[+T] extends Serializable {
  def isDefined: Boolean
}
object Option {
  def apply[T](x: T) = if (x != null) Some(x) else None
  case Some[+T](x: T) {
     def isDefined = true
  }
  case None {
     def isDefined = false
  }
}

However, the codes does not compiles in Scala 3.0. How to change the code to make it work? Thanks.

EDIT Thanks for @Mario Galic's answer.

I want to grouped a series of compression method as an enum, as following:

enum CompressionMethod:
  def compress(out: OutputStream): OutputStream
  def decompress(in: InputStream): InputStream

  case GZIP extends CompressionMethod: ...
  case BZIP extends CompressionMethod: ...
  case NONE extends CompressionMethod: ...

It seems ugly if I packed all implementation as:

enum CompressionMethod:   
  def compress(out: OutputStream): OutputStream = this match
    case NONE  => out
    case BZIP  => a lot codes ..
    case GZIP  => a lot codes ..
    case ...

Moreover, I need to modify the compress method if I add another case later other than just add an other case instance itself. Something like:

enum CompressionMethod:
  def compress(out: OutputStream): OutputStream
  
  case GZIP extends CompressionMethod:
    override def compress(out: OutputStream): OutputStream =
      ...

  case BZIP extends CompressionMethod:
    override def compress(out: OutputStream): OutputStream =
      ...

Solution

  • One tip is to check tests for most up-to-date usage, for example, tests/run/enum-Option1.scala

    $ scala3-repl
    scala> enum Option1[+T]:
         |   case Some1(x: T)
         |   case None1
         |
         |   def isDefined: Boolean = this match
         |     case None1 => false
         |     case _    => true
         |
    // defined class Option1
    
    scala> import Option1.*
    
    scala> Some1(42).isDefined
    val res0: Boolean = true
    
    scala> None1.isDefined
    val res1: Boolean = false