Scala 处理或检测字符串+枚举,防止添加默认字符串
我正在转换一个连接字符串和枚举值的大型代码。代码使用Int作为枚举类型,我想将其转换为适当的枚举,最好扩展枚举,但trait+对象也可以。我希望编译器执行从枚举到数值的转换,或者至少在我尝试向字符串添加枚举值时给我一个编译器错误 尽管我做出了努力,以下代码仍然打印出DEPTH=D0,因为存在恼人的默认Scala字符串运算符+:Scala 处理或检测字符串+枚举,防止添加默认字符串,scala,implicit,Scala,Implicit,我正在转换一个连接字符串和枚举值的大型代码。代码使用Int作为枚举类型,我想将其转换为适当的枚举,最好扩展枚举,但trait+对象也可以。我希望编译器执行从枚举到数值的转换,或者至少在我尝试向字符串添加枚举值时给我一个编译器错误 尽管我做出了努力,以下代码仍然打印出DEPTH=D0,因为存在恼人的默认Scala字符串运算符+: import scala.language.implicitConversions object Main extends App { implicit class
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 哪个输出
s: String = DEPTH=100
考虑像这样重写toString的ADT 哪个输出
s: String = DEPTH=100
正如Mario所示,重写toString比更改内置String+容易得多。必要时,可使用相同的方法进行枚举:
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)
}
正如Mario所示,重写toString比更改内置String+容易得多。必要时,可使用相同的方法进行枚举:
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)
}
如果没有必要,编译器将永远不会转到隐式。更好/更容易选择不同的方法名称:++。是的,这显然是可行的,但是代码是Javascript自动转换的结果,最好不必手动调整,因为任何手动操作因素都会增加引入错误的风险。您可以禁用Predef并使用自己的字符串,但这听起来很严厉。实际上你可以重新定义字符串,但编译器仍然知道什么是字符串文字。您可以使用自定义插值器而不是返回自定义字符串。我做了一个实验,为apply创建了语法,这将为您提供上述语法。现在我看到applylator apply interpolator是多么有用。您还可以编写Scalafix规则,将普通str文本转换为插值字符串。哦,好吧。至少你得到了一个真实的答案。如果没有必要,编译器永远不会去隐式编译。更好/更容易选择不同的方法名称:++。是的,这显然是可行的,但是代码是Javascript自动转换的结果,最好不必手动调整,因为任何手动操作因素都会增加引入错误的风险。您可以禁用Predef并使用自己的字符串,但这听起来很严厉。实际上你可以重新定义字符串,但编译器仍然知道什么是字符串文字。您可以使用自定义插值器而不是返回自定义字符串。我做了一个实验,为apply创建了语法,这将为您提供上述语法。现在我看到applylator apply interpolator是多么有用。您还可以编写Scalafix规则,将普通str文本转换为插值字符串。哦,好吧。至少你得到了一个真实的答案。