处理或检测字符串 + 枚举以防止添加默认字符串

Handle or detect string + enum preventing default string addition

我正在转换连接字符串和枚举值的大型代码。该代码使用 Int 作为枚举类型,我想将其转换为适当的枚举(最好是 extends Enumeration,但 trait + objects 也可以)。我希望编译器执行从枚举到数值的转换,或者至少在我尝试将枚举值添加到字符串时给我一个编译器错误。

尽管我很努力,但由于烦人的默认 Scala 字符串运算符 +:

,下面的代码仍然打印 DEPTH=D0
import scala.language.implicitConversions

object Main extends App {
  implicit class StringPlus(s: String) {
    def + (v: Enumeration#Value): String = s + v.id.toString
  }
  implicit def str(v: Enumeration#Value): String = v.id.toString

  val b = true
  object D extends Enumeration {
    val D0 = Value(100)
  }
  val d = D.D0
  val s = "DEPTH=" + d
  println(s)
}

有没有办法禁用默认字符串+,以便编译器处理或检测上述情况?我目前使用的是 Scala 2.12,但如果需要,我可以移植到 2.13。

像这样考虑 ADT 覆盖 toString

sealed abstract class D(val value: Int) {
  override def toString: String = value.toString
}
case object D0 extends D(100)
case object D1 extends D(200)

val d = D0
val s = "DEPTH=" + d

输出

s: String = DEPTH=100

正如 Mario 所展示的,覆盖 toString 比更改内置的 String + 更容易。必要时可以对 Enumeration 使用相同的方法:

  abstract class MyEnumeration extends Enumeration {
    class MyVal(i: Int) extends Val(i, null) {
      override def toString = i.toString
    }
    def MyValue(i: Int) = new MyVal(i)
  }

  object D extends MyEnumeration {
    val D0 = MyValue(100)
  }