Собственный код скомпилирован для работы непосредственно с ОС. Управляемый код, однако, предварительно скомпилирован (байт-код в Java-говорить), но затем обрабатывается компилятором Just In Time в собственный код во время выполнения. Управляемый код имеет интересный побочный эффект наличия возможности работы в разных операционных системах, поскольку машинный код не создается до тех пор, пока виртуальная виртуальная машина фактически не использует его. Таким образом, вы можете запускать .NET-приложения в Windows, а также запускать их на Linux или Mac, на которых установлена среда исполнения Mono. Переносимость в настоящее время не так чиста, как Java (из-за естественной закрытой архитектуры Microsoft), но концепция остается.
Если вы используете неуправляемое приложение, код был скомпилирован для запуска для указанной ОС / Аппаратное обеспечение. Любая переносимость к другому набору OS / команд теряется и должна быть перекомпилирована для выполнения.
Базовая реализация не должна быть классом дел. Просто сделайте это признаком, и тогда все ваши кейс-классы смогут его расширить.
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
... и т. Д.
Если я правильно понимаю ваш сценарий использования, вы можете использовать класс типов 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)))