提问人:airfoyle 提问时间:8/1/2021 最后编辑:airfoyle 更新时间:8/3/2021 访问量:101
Scala 使用带引号的对象进行编译时检查。类型
Scala Compile-time checking of object using quoted.Type
问:
我有一个 Scala 3 类,其实例包含带引号的。键入 object 以捕获实例的类型:
class Skey[T](val name: Symbol)(using val qt: quoted.Type[T])
拥有那里的全部意义在于验证 是否是正确的类型,但是,在典型情况下,我有一个函数想要返回检索到的 ,示意性地表示如下(自原始帖子以来编辑):qt
Skey
Skey
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 是一个而不是其他类型的?x
quoted.Type
Skey[T]
Skey
我敢肯定在 Scala 2 中没有办法做到这一点,但我对 Scala 3 有我的手指交叉,它对类型级编程的处理更干净。
答: 暂无答案
评论
if x.qt == y.qt then Skey[T](x.name)(using y.qt)
==
x
x
Skey[T]
Skey[A]