Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 处理或检测字符串+枚举,防止添加默认字符串_Scala_Implicit - Fatal编程技术网

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

Scala 处理或检测字符串+枚举,防止添加默认字符串,scala,implicit,Scala,Implicit,我正在转换一个连接字符串和枚举值的大型代码。代码使用Int作为枚举类型,我想将其转换为适当的枚举,最好扩展枚举,但trait+对象也可以。我希望编译器执行从枚举到数值的转换,或者至少在我尝试向字符串添加枚举值时给我一个编译器错误 尽管我做出了努力,以下代码仍然打印出DEPTH=D0,因为存在恼人的默认Scala字符串运算符+: import scala.language.implicitConversions object Main extends App { implicit class

我正在转换一个连接字符串和枚举值的大型代码。代码使用Int作为枚举类型,我想将其转换为适当的枚举,最好扩展枚举,但trait+对象也可以。我希望编译器执行从枚举到数值的转换,或者至少在我尝试向字符串添加枚举值时给我一个编译器错误

尽管我做出了努力,以下代码仍然打印出DEPTH=D0,因为存在恼人的默认Scala字符串运算符+:

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文本转换为插值字符串。哦,好吧。至少你得到了一个真实的答案。