如何在伴随对象中混合自我注释
How to mix in self annotations in companion object
考虑以下情况:
trait M { } // uses N
object M { def apply = new M { } }
trait N { self: L => }
trait L { val m: B }
type B
M 需要在 N 中创建的新树定义。我不想传递这些新树,因为 class 层次结构实际上很长,会导致大量代码修改。相反,我被提议做:
trait M { self: N with L => } // uses N
object M { def apply = new M with N with L { } }
trait N { self: L => }
trait L { val m: B }
type B
但我得到错误:
object creation impossible, since value m in trait L of type B is not
defined
这来自对象 M 的定义。我尝试了不同的组合并且 none 有效。
如何解决这个错误?
讨论
我了解到在写 new M {}
时我得到一个匿名的 class extending (object??) M,所以我尝试修改为 new M with N with L {}
但后来我得到了未实现的错误来自 L.
的成员
参考资料
您可以在此 commit 上找到有关该问题的更多详细信息。即类型M是MeasureAnnotation,N是StructuralSize,L是SolverProvider。
如果您想构建程序,您应该 git 克隆,然后 运行 sbt
然后 universal:stage
。您需要安装 z3 或 cvc4。
我认为您的代码片段没有准确反映您的实际提交。
在您的提交中,您也在对象上使用了 self 类型,这是没有意义的。特征的自我类型描述了混合在该特征中的具体实例必须满足的要求。但是,对象已经是具体类型,因此没有必要再定义进一步的要求。
简而言之:不要在伴生对象上重复特征的自我类型。
考虑以下情况:
trait M { } // uses N
object M { def apply = new M { } }
trait N { self: L => }
trait L { val m: B }
type B
M 需要在 N 中创建的新树定义。我不想传递这些新树,因为 class 层次结构实际上很长,会导致大量代码修改。相反,我被提议做:
trait M { self: N with L => } // uses N
object M { def apply = new M with N with L { } }
trait N { self: L => }
trait L { val m: B }
type B
但我得到错误:
object creation impossible, since value m in trait L of type B is not defined
这来自对象 M 的定义。我尝试了不同的组合并且 none 有效。
如何解决这个错误?
讨论
我了解到在写 new M {}
时我得到一个匿名的 class extending (object??) M,所以我尝试修改为 new M with N with L {}
但后来我得到了未实现的错误来自 L.
参考资料
您可以在此 commit 上找到有关该问题的更多详细信息。即类型M是MeasureAnnotation,N是StructuralSize,L是SolverProvider。
如果您想构建程序,您应该 git 克隆,然后 运行 sbt
然后 universal:stage
。您需要安装 z3 或 cvc4。
我认为您的代码片段没有准确反映您的实际提交。 在您的提交中,您也在对象上使用了 self 类型,这是没有意义的。特征的自我类型描述了混合在该特征中的具体实例必须满足的要求。但是,对象已经是具体类型,因此没有必要再定义进一步的要求。
简而言之:不要在伴生对象上重复特征的自我类型。