如何访问案例类字段的默认值?

问题描述

我想使用Decoder[A]为任意案例类派生某种类型(shapeless)的实例。

trait Decoder[A] extends Serializable { self =>
  def decode(source: String): Either[Throwable,A]
}

如果我不考虑案例类的默认值,那么使用基本方法一切都会很好:

  final implicit def genericDecoder[A,H <: HList](
    implicit gen: LabelledGeneric.Aux[A,H],hDecoder: Lazy[Decoder[H]]
  ): Decoder[A] = value => hDecoder.value.decode(value).map(gen.from)

  final implicit val hnilDecoder: Decoder[HNil] = ???

  final implicit def hlistDecoder[K <: Symbol,H,T <: HList](
    implicit witness: Witness.Aux[K],hDecoder: Lazy[Decoder[H]],tDecoder: Lazy[Decoder[T]]
  ): Decoder[FieldType[K,H] :: T] = ???

现在,我希望能够为无法解码的字段使用默认值。在这种情况下,我尝试了这种方法(添加了额外的抽象层):

trait DecoderWithDefaults[A,B] extends Serializable {
  def decode(value: String,defaults: B): Either[Throwable,A]
}

  final implicit def genericDecoder[A,H <: HList,HD <: HList](
    implicit gen: LabelledGeneric.Aux[A,defaults: Default.AsOptions.Aux[A,HD],hDecoder: Lazy[DecoderWithDefaults[H,HD]]
  ): Decoder[A] = value => hDecoder.value.decode(value,defaults()).map(gen.from)

  final implicit val hnilDecoder: DecoderWithDefaults[HNil,HNil] = (_,_) => Right(HNil)

  final implicit def hlistDecoder[K <: Symbol,T <: HList,TD <: HList](
    implicit witness: Witness.Aux[K],Option[H]]],tDecoder: Lazy[DecoderWithDefaults[T,TD]]
  ): DecoderWithDefaults[FieldType[K,H] :: T,Option[H] :: TD] = ???

所以,我的问题是:是否可以实现相同的目的,而无需使用其他抽象层(在这种情况下,像DecoderWithDefaults)?像这样:

  final implicit def hlistDecoder[K <: Symbol,defaultValueHead: Option[H],H] :: T] = ???

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...