E4213

E4213#

Compiler diagnostic name: invalid_constr_self_type.

不能为 &Trait 这样的 trait 对象类型定义自定义构造器。

MoonBit 支持为用户定义的具体类型(包括结构体、枚举和 newtype)定义自定义构造器。trait 对象是经过类型擦除的运行时视图,并不是能拥有构造器的具体类型,因此 fn &Trait::Trait(...) 会被拒绝。

错误示例#

///|
pub(open) trait Renderable {
  fn render(Self) -> String
}

///|
pub fn[X : Renderable] &Renderable::Renderable(value : X) -> &Renderable {
  value as &Renderable
}

错误示例试图将 &Renderable::Renderable 用作 trait 对象类型的构造器。

建议#

使用普通函数将值转换为 trait 对象,或在具体的包装类型上定义自定义构造器。

///|
pub(open) trait Renderable {
  fn render(Self) -> String
}

///|
pub fn[X : Renderable] as_renderable(value : X) -> &Renderable {
  value as &Renderable
}