Можно ли написать аналог бесформенного Generic.from без макросов - PullRequest
0 голосов
/ 25 августа 2018

Я пишу свои собственные минималистичные HList / Generic реализации для получения кодеров для нескольких моих собственных классов case.

Мне удалось написать ToTuple свидетельство, но во всех моих классах дел более 22 членов, поэтому я не могу использовать функцию tupled. Также я бы по возможности не использовал макросы.

Возможно ли преобразовать HList в класс case без макросов?

Помимо ограничений, у моего варианта использования также есть несколько рельефов (не уверен, что они могут помочь):

  • Там нет запечатанных черт, только классы дел
  • Все классы дел, которые мне нужно декодировать, находятся в моей библиотеке, поэтому я могу добавить минимальный шаблон к их определениям

1 Ответ

0 голосов
/ 27 августа 2018

Преобразование класса case в hlist возможно с использованием .productIterator. Но преобразование hlist в case-класс возможно либо с помощью макросов (или бесформенных, где макросы используются под капотом), либо написанием таких методов, как

case class MyClass(i: Int, s: String, b: Boolean)

object MyClass {
  def from(x: Int :: String :: Boolean :: HNil): MyClass = x match {
    case i :: s :: b :: HNil => MyClass(i, s, b)
  }
}

для каждого класса дел. Дело в том, что вы не можете написать

def from[T](x: ...): T = new T(...) //pseudocode

без макросов (или отражения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...