处理或检测字符串 + 枚举以防止添加默认字符串
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)
}
我正在转换连接字符串和枚举值的大型代码。该代码使用 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)
}