Метод toString для унаследованного класса case в Scala - PullRequest
1 голос
/ 26 апреля 2020

Я столкнулся с некоторой несогласованностью при вызове метода toString для case-классов в Scala. Первый пример кода:

case class Person(name: String, age: Int)
val jim = Person("jim", 42)
println(jim)

вывод: Person(jim,42)

Для следующего примера кода я использовал класс case, который расширяет Exception:

case class JimOverslept(msg: String) extends Exception
try {
  throw JimOverslept(msg = "went to bed late")
} catch {
  case e: JimOverslept => println(e)
}

вывод: playground.CaseClassOutput$JimOverslept

На самом деле, я бы предпочел вывод как JimOverslept(went to bed late)

В чем причина того, что оба выхода так различны? И как лучше всего получить результат, который выглядит как нужный (JimOverslept(went to bed late))

1 Ответ

6 голосов
/ 26 апреля 2020

Согласно SLS 5.3.2 Классы дел

Каждый класс дел неявно переопределяет некоторые определения методов класса scala.AnyRef , если только определение этого метода не является уже дано в самом классе case или конкретное определение того же метода дано в некотором базовом классе класса case, отличного от AnyRef.

Теперь toString уже предоставлен base класс в

case class JimOverslept(msg: String) extends Exception

, где Exception расширяет базу Throwable, что обеспечивает toString определение. Поэтому попробуйте предоставить переопределение внутри самого класса case, например

case class JimOverslept(msg: String) extends Exception {
  override def toString: String = scala.runtime.ScalaRunTime._toString(this)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...