如何挂载 izumi.reflect.Tag?

问题描述 投票:0回答:1

我一直在使用

izumi.reflect.Tag
来保存类型信息,效果很好。除非我在某个时候丢失了该类型信息,然后我不知道如何恢复它。这就是我想做的:

case class Rule[T: Tag](lhs: String, rhs: Repr[T])

这太棒了。

Rule
知道其内部
rhs
的类型。除了...

val rules: List[Rule[?]] = // some list of rules
rules.foreach { r =>
  process(r)
}

def process[T: Tag](rule: Rule[T]): Unit = // side-effectful processing

此时,我明白了

could not find implicit value for izumi.reflect.Tag[T]
。好吧,没什么大惊喜。那个
Tag
无法恢复,因为它与
List
中的所有其他标签混合在一起。但是有什么方法可以保存标签以便稍后取回吗?

我已经尝试过了

case class Rule[T: Tag](lhs: String, rhs: Repr[T]):
   val LightTypeTag = Tag[T].tag

以及类似的方法来抓住

Tag
,这样我就可以做类似的事情

process(r, r.tag)

def process[T: Tag](rule: Rule[T], tag: Tag[T]) = ...

或显式地将

Tag[T]
传递到
process
方法中,但我不知道如何执行以下任何操作:

  1. 保存类型为
    Tag[T]
    的值。
  2. LightTypeTag
    类型的值转换回
    Tag[T]
  3. 显式保存和使用其他一些值的其他一些组合将进行此类型检查。

非常感谢任何帮助。

scala scala-macros scala-3
1个回答
0
投票

好的。当然,在我发布此内容后,我想我得到了答案,但我想确定它是正确的。我意识到我真的想要一个

Tag[T]
,但我不知道如何获得一个,但后来我意识到我有一个
given Tag[T]
可用,所以我做到了

case class Rule[T: Tag](lhs: String, rhs: Repr[T]):
  val tag: Tag[T] = summon[Tag[T]]

如果我在缺少隐式

(using rule.tag)
的地方添加
Tag[T]
,事情似乎就可以了。这是处理这个问题的正确方法吗?

© www.soinside.com 2019 - 2024. All rights reserved.