【问题标题】:circe automatic derivation - struggling with the importscirce 自动推导 - 与进口作斗争
【发布时间】:2019-02-17 21:55:58
【问题描述】:

我的 API 上公开了一个方法,如下所示:

def read[T](implicit decoder: Decoder[T]): T

用户可以携带任何他们喜欢的T,我的代码会尝试将json结果解析为T

我要解决的问题是任何用户还必须导入 io.circe.generic.auto._ 才能使其正常工作并自动派生 Decoder[T]

有什么方法可以更改我的 API 以避免用户必须进行此导入?

【问题讨论】:

  • 您的描述不太正确。用户不能带任何T,他们只能带一个T,其中有Decoder[T] 类型的隐式值。重要的是,用户要知道这取决于 circe 库,而不是您的代码,所以他们需要拥有 import 是很好的。
  • 同意@Tim,但还要注意,使用io.circe.generic.auto 可能会导致奇怪的副作用:每次尝试解决新的隐含问题时,它都会生成 Decoder[T]范围,因此您可以为每个需要 implicit decoder: Decoder[T] 的方法使用单独的解码器实例

标签: scala circe


【解决方案1】:

如果您在库中执行此操作,可能会发生 - 隐式很容易发生冲突,从而给您的用户带来麻烦。

在 Typelevel Scala 4 中可以使用 customizable imports - 它没有出现在 Scala 2.12 中,但(经过多次迭代)landed on 2.13。一旦 2.13.0 发布,您可以建议您的用户始终以这种方式在范围内使用一些隐式,但这将是他们有意识的决定。

【讨论】:

  • 嗯 - 您的代码似乎不起作用(它无法编译)。我确实尝试过探索您使用类型别名的想法,但我什么也没做。是的,这是应用程序之间共享的公共模块/库。
  • 我猜你将类型别名直接放在文件中,这是 Scala 不允许的。将其放入包对象中并尝试再次编译。
  • 类型别名在包对象中,您发布的代码无法编译(与类型别名无关,它是隐式定义的)
  • 我本可以发誓它有效并且我在我的代码中使用了它,但显然我错了。我编辑了答案。
猜你喜欢
  • 2014-10-29
  • 1970-01-01
  • 2022-07-02
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
相关资源
最近更新 更多