如何解决如何访问案例类字段的默认值?
我想使用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 举报,一经查实,本站将立刻删除。