我正在转换一个大型代码,该代码将字符串和枚举值连接在一起。该代码使用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。
像这样考虑具有替代的toString
的ADT
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)
}