E4073#
不能为外来特征定义默认实现。
This is a corollary of the orphan rules of traits and types in MoonBit. Default implementation can be seen as implementing the trait for all possible types, which include foreign and native types. Therefore, it is only possible for default implementation to be defined in the package of the trait, otherwise it would violate the orphan rules.
错误示例#
Suppose you have a trait T
defined in package a
in module username/hello
:
a/a.mbt
:
// We need the trait to be pub(open) so that it can be implemented from outside.
pub(open) trait T {
f(Self) -> Int
}
And when you want to define a default implementation for the trait in another
package, say b
:
b/moon.pkg.json
:
{
"import": [
"username/hello/a"
]
}
b/b.mbt
:
impl @a.T with f(self : Self) -> Int {
// ^
// Error: Cannot provide default implementation for foreign trait @a.T
ignore(self)
0
}
建议#
To fix this error, you can move the definition of the trait and the default
implementation of this trait into the same package. Say you can move the trait
definition into package b
:
b/b.mbt
:
pub(open) trait T {
f(Self) -> Int
}
impl T with f(self : Self) -> Int {
ignore(self)
0
}