>我正在转换一个连接字符串和枚举值的大代码。代码使用Int
作为枚举类型,我想将其转换为适当的枚举(最好是extends Enumeration
,但trait
+objects
也可以(。我希望编译器执行从枚举到数值的转换,或者至少在我尝试将枚举值添加到字符串时给我一个编译器错误。
尽管我付出了努力,但由于烦人的默认 Scala String 运算符 +,以下代码仍然打印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
正如马里奥所展示的那样,覆盖toString
比更改内置的字符串+要容易得多。必要时,可以使用相同的方法进行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)
}