E4061

E4061#

无法为类型和特征(trait)都定义在其他包中的情况实现该特征(trait)

MoonBit 遵循孤儿规则(orphan rule),这意味着你只能在以下情况下实现特征(trait):

特征(trait)

类型

允许实现?

当前包

当前包

其他包

当前包

当前包

其他包

其他包

其他包

See the Access control of methods and trait implementations section of the MoonBit documentation for more information.

错误示例#

Suppose you have type A and trait B defined in package a in module username/hello:

a/a.mbt:

pub(all) type A Int
pub(open) trait B {
  to_int(Self) -> Int
}

a/moon.pkg.json:

{}

Now, if you want to implement trait @a.B for type @a.A:

b/moon.pkg.json:

{
  "import": [
    "username/hello/a"
  ]
}

b/b.mbt:

impl @a.B for @a.A with to_int(self : @a.A) -> Int {
  //                    ^~~~~~
  // Error: Cannot define method to_int of trait @a.B from package a for type @a.A from package a
  self._
}

MoonBit 会报错。

建议#

您可以将特征或类型移动到实现所在的当前包中。如果这不可能,您可以在希望实现特征的类型上创建一个新类型,然后为新类型实现特征:

b/b.mbt:

type WrapA @a.A

impl @a.B for WrapA with to_int(self : WrapA) -> Int {
  ...
}