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

问题描述 投票:1回答:2

我正在转换一个大型代码,该代码将字符串和枚举值连接在一起。该代码使用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。

scala implicit
2个回答
4
投票

像这样考虑具有替代的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

0
投票

正如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)
  }

© www.soinside.com 2019 - 2024. All rights reserved.