我想利用 Scala 的类型系统来限制系统中的操作,其中存在对某些值的版本化引用。这一切都发生在一些附加Ctx了版本类型的事务上下文中。V现在有一个Factory创建参考变量。它们是通过附加的创建V1版本(类型参数)创建的,对应于调用工厂的上下文版本。
现在想象一些代码试图在更高版本中访问该引用,即使用不同的Ctx. 我想要实现的是禁止在与创建版本不匹配的Ref任何版本(Ctx的V类型字段)中调用访问权限,但允许您通过一些返回新的替换机制来解析引用Ref可以在当前版本中访问的视图。(如果substitute使用无效的上下文调用它是可以的,例如,一个比Ref's旧的上下文V1——在这种情况下,可能会引发运行时异常)
这是我的尝试:
trait Version
trait Ctx {
type V <: Version
}
object Ref {
implicit def access[C <: Ctx, R, T](r: R)(implicit c: C, view: R => Ref[C#V, T]): T =
view(r).access(c)
implicit def substitute[C <: Ctx, T](r: Ref[_ <: Version, T])
(implicit c: C): Ref[C#V, T] = r.substitute(c)
}
trait Ref[V1 <: Version, T] {
def access(implicit c: { type V = V1 }): T // ???
def substitute[C <: Ctx](implicit c: C): Ref[C#V, T]
}
trait Factory {
def makeRef[C <: Ctx, T](init: T)(implicit c: C): Ref[C#V, T]
}
问题是以整个编译的方式定义类方法access,即复合对象access应该编译,但同时我不能access用any Ctx调用这个类方法,只能用一个版本与引用版本匹配的方法。
最好没有结构类型或任何强加性能问题的东西。