在 scodec 中使用嵌套大小写 类
Using nested case classes with scodec
使用 scodec 定义消息时,我想使用嵌套大小写 classes。例如:
case class Foo(x: Int, y: Int)
object Foo {
def baseCodec = uint16 :: uint16
def codec = baseCodec.as[Foo]
}
case class Bar(a: Int, foo: Foo, b: Int)
object Bar {
val baseCodec = uint8 :: Foo.baseCodec :: uint16
val codec = baseCodec.as[Bar]
}
然而,在尝试编译时我得到以下信息:
error: Could not prove that shapeless.::[Int,shapeless.::[shapeless.::[Int,shapeless.::[Int,shapeless.HNil]],shapeless.::[Int,shapeless.HNil]]] can be converted to/from Bar.
val codec = baseCodec.as[Bar]
^
有办法吗? (在我的真实代码中,有时嵌套大小写 class 出现在包含 class' 参数列表的开头,有时在中间,有时在结尾)。
我明白了。您需要使用编解码器,而不是 HList。这有效:
object Bar {
//Foo.codec instead of Foo.baseCodec
val baseCodec = uint8 :: Foo.codec :: uint16
val codec = baseCodec.as[Bar]
}
使用 scodec 定义消息时,我想使用嵌套大小写 classes。例如:
case class Foo(x: Int, y: Int)
object Foo {
def baseCodec = uint16 :: uint16
def codec = baseCodec.as[Foo]
}
case class Bar(a: Int, foo: Foo, b: Int)
object Bar {
val baseCodec = uint8 :: Foo.baseCodec :: uint16
val codec = baseCodec.as[Bar]
}
然而,在尝试编译时我得到以下信息:
error: Could not prove that shapeless.::[Int,shapeless.::[shapeless.::[Int,shapeless.::[Int,shapeless.HNil]],shapeless.::[Int,shapeless.HNil]]] can be converted to/from Bar.
val codec = baseCodec.as[Bar]
^
有办法吗? (在我的真实代码中,有时嵌套大小写 class 出现在包含 class' 参数列表的开头,有时在中间,有时在结尾)。
我明白了。您需要使用编解码器,而不是 HList。这有效:
object Bar {
//Foo.codec instead of Foo.baseCodec
val baseCodec = uint8 :: Foo.codec :: uint16
val codec = baseCodec.as[Bar]
}