Обрабатывать или определять строку + перечисление, предотвращающее добавление строки по умолчанию - PullRequest
1 голос
/ 11 января 2020

Я преобразовываю большой код, который объединяет строковые и перечисляемые значения. Код использовал Int в качестве типа перечисления, и я хочу преобразовать его в правильные перечисления (предпочтительно extends Enumeration, но trait + objects также подойдет). Я хочу, чтобы компилятор либо выполнял преобразование из enum в числовое значение c, либо, по крайней мере, выдавал ошибку компилятора всякий раз, когда я пытался добавить значение enum в строку.

Несмотря на мои после того, как следующий код все еще печатает 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.

Ответы [ 2 ]

4 голосов
/ 11 января 2020

Рассмотрим 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
1 голос
/ 11 января 2020

Как показал Марио, гораздо проще изменить 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)
  }

...