Подтвердить что ты не робот

Переопределение метода toString в Scala Перечисление

Как я могу переопределить "toString", чтобы этот код Scala действовал как следующий код Java.

Код в Scala

object BIT extends Enumeration {
     type BIT = Value
     val ZERO, ONE, ANY = Value

     override def toString() =
       this match {
       case ANY => "x "
       case ZERO=> "0 "
       case ONE => "1 "
     }
}

val b = ONE
println(ONE)  // returns ONE

Требуемое поведение toString должно выдавать тот же результат, что и следующий код Java.

public enum BIT {
    ZERO, ONE, ANY;

    /** print BIT as 0,1, and X */
    public String toString() {
        switch (this) {
        case ZERO:
            return "0 ";
        case ONE:
            return "1 ";
        default://ANY
            return "X ";
        }
    }
}

BIT b = ONE;
System.out.println(b); // returns 1

Я думаю, что я переопределяю неправильный метод toString.

4b9b3361

Ответ 1

Во-первых, да, вы переопределяете неправильный метод toString. Вы переопределяете метод самого объекта BIT, что не очень полезно.

Во-вторых, вы делаете это намного проще, просто делая

object BIT extends Enumeration {
  type BIT = Value
  val ZERO = Value("0")
  val ONE = Value("1")
  val ANY = Value("x")
}

Затем вы можете сделать

println(BIT.ONE) //prints "1"

Ответ 2

Если вы хотите установить значение и строку, вы можете сделать это следующим образом:

scala> object BIT extends Enumeration {
     |   type BIT = Value
     |   val ZERO = Value(0, "0")
     |   val ONE = Value(1, "1")
     |   val ANY = Value("x")
     | }
defined module BIT

scala> BIT.ZERO.toString
res2: String = 0

scala> BIT.ZERO.id
res3: Int = 0

scala> BIT.ANY.id
res4: Int = 2

scala> BIT.ANY.toString
res5: String = x