Scala: абстракция функции toString для классов case

Собственный код скомпилирован для работы непосредственно с ОС. Управляемый код, однако, предварительно скомпилирован (байт-код в Java-говорить), но затем обрабатывается компилятором Just In Time в собственный код во время выполнения. Управляемый код имеет интересный побочный эффект наличия возможности работы в разных операционных системах, поскольку машинный код не создается до тех пор, пока виртуальная виртуальная машина фактически не использует его. Таким образом, вы можете запускать .NET-приложения в Windows, а также запускать их на Linux или Mac, на которых установлена ​​среда исполнения Mono. Переносимость в настоящее время не так чиста, как Java (из-за естественной закрытой архитектуры Microsoft), но концепция остается.

Если вы используете неуправляемое приложение, код был скомпилирован для запуска для указанной ОС / Аппаратное обеспечение. Любая переносимость к другому набору OS / команд теряется и должна быть перекомпилирована для выполнения.

1
задан suleydaman 21 March 2019 в 10:05
поделиться

2 ответа

Базовая реализация не должна быть классом дел. Просто сделайте это признаком, и тогда все ваши кейс-классы смогут его расширить.

 trait Stringification { self: Product => 
    override def toString() = 
      getClass.getDeclaredFields
      .zip(productIterator.toSeq)
      .map { case (a, b) => s"${a.getName}=$b" }
      .mkString("\n")
 }

, а затем

  case class Foo(foo: String, bar: Int) extends Stringification
  case class Bar(foo: Foo, bar: String) extends Stringification

... и т. Д.

0
ответ дан Dima 21 March 2019 в 10:05
поделиться

Если я правильно понимаю ваш сценарий использования, вы можете использовать класс типов Cats по умолчанию Show или, если вам нужно больше настраиваемого поведения, вы можете напрямую использовать обобщенную деривацию с помощью Shapeless для достижения того, что вам нужно.

Для более легкого сценария Cat Show читайте здесь .

Как вы можете читать, он имеет синтаксис, который позволит вам сделать myObject.show для любого T, который имеет Show[T] в области видимости.

Если вы хотите более настраиваемое поведение, вы можете попробовать перейти непосредственно к Shapeless. Пример того, что вам нужно, можно найти в в этом примере Show type-class , и вы можете увидеть, что он работает здесь .

С учетом этих классов дел:

  sealed trait Super
  case class Foo(i: Int, s: String) extends Super
  case class Bar(i: Int) extends Super
  case class BarRec(i: Int, rec: Super) extends Super

  sealed trait MutualA
  case class MutualA1(x: Int) extends MutualA
  case class MutualA2(b: MutualB) extends MutualA

  sealed trait MutualB
  case class MutualB1(x: Int) extends MutualB
  case class MutualB2(b: MutualA) extends MutualB

Будет напечатано:

Bar(i = 0)   
BarRec(i = 1, rec = Foo(i = 0, s = foo))   
MutualA2(b = MutualB2(b = MutualA1(x = 0)))
0
ответ дан mdm 21 March 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: