Какой лучший способ восстановить реализацию по умолчанию класса case toString - PullRequest
0 голосов
/ 20 января 2020

Скажите, что я делаю следующее:

trait A {
    val i: Int
    override def toString = s"A($i)"
}

case class B(i: Int, j: Int) extends A

println(B(2, 3))

Это даст мне вывод:

A (2)

Есть ли способ, которым я могу заставить B.toString вернуться к стандартному toString для класса case без необходимости явной записи:

override def toString = s"B($i,$j)"

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Возможно

trait A {
  val i: Int
  override def toString = this match {
    case p: Product => scala.runtime.ScalaRunTime._toString(p)
    case _ => s"A($i)"
  }
}

case class B(i: Int, j: Int) extends A

class Foo extends A {
  override val i = 42
}

B(2, 3)
new Foo

, который выводит

res0: B = B(2,3)
res1: Foo = A(42)
2 голосов
/ 20 января 2020

Раньше это было

override def toString = scala.runtime.ScalaRunTime._toString(this)

, но этот объект был удален в 2.12 РЕДАКТИРОВАТЬ: он был удален только из ScalaDo c, но все еще существует.

Чтобы не полагаться на ScalaRunTime._toString, вы можете определить его самостоятельно:

def _toString(x: Product): String =
  x.productIterator.mkString(x.productPrefix + "(", ",", ")")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...