Scala 使用带引号的对象进行编译时检查。类型

Scala Compile-time checking of object using quoted.Type

提问人:airfoyle 提问时间:8/1/2021 最后编辑:airfoyle 更新时间:8/3/2021 访问量:101

问:

我有一个 Scala 3 类,其实例包含带引号的。键入 object 以捕获实例的类型:

class Skey[T](val name: Symbol)(using val qt: quoted.Type[T])

拥有那里的全部意义在于验证 是否是正确的类型,但是,在典型情况下,我有一个函数想要返回检索到的 ,示意性地表示如下(自原始帖子以来编辑):qtSkeySkey

class SkeyIndex(...):
  private var hMap = immutable.HashMap[String, Skey[?]]:
  ...
  def lookup(y: Skey[T], ...): Option[Skey[T]] =
    val existing: Option[Skey[?]] = hMap.get(name)
    existing match 
      case None => None
      case x @ Skey[?] => 
         if x.qt == y.qt then x // THIS IS NOT QUITE RIGHT!
         else ...

相等性测试验证它确实是正确的类型,但在运行时。有没有一个匹配的成语或一些涉及匹配类型的魔术,可以让编译器推断出 x 是一个而不是其他类型的?xquoted.TypeSkey[T]Skey

我敢肯定在 Scala 2 中没有办法做到这一点,但我对 Scala 3 有我的手指交叉,它对类型级编程的处理更干净。

scala 匹配 编译时 scala-3

评论

0赞 airfoyle 8/1/2021
我意识到我可以写,但这是丑陋和毫无意义的,因为对象将是除了类型之外。if x.qt == y.qt then Skey[T](x.name)(using y.qt)==x
0赞 sarveshseri 8/1/2021
这很大程度上取决于它来自哪里。如果它是在运行时以某种方式动态创建的,或者基于某个运行时值的其他方式,那么不可以,您无法在编译时验证其类型。xSkey[T]Skey[A]
0赞 airfoyle 8/3/2021
@sarveshseri:我编辑了这个问题,使其更忠实于我真正想要的东西,即检查从地图中检索的实体的类型。

答: 暂无答案