E1045

E1045#

Implementing traits with methods.

最初,MoonBit 允许使用普通方法隐式地实现特征。但我们计划废弃这一行为,只允许用显式的 impl 声明来实现特征。目前,这一废弃处于迁移阶段,MoonBit 依然支持旧的语义,但如果程序使用了普通方法来隐式地实现特征,编译器就会产生该警告。

错误示例#

type MyType Int

fn op_equal(self : MyType, other : MyType) -> Bool {
  self._ == other._
}

test {
  // `==` 会调用 `Eq::op_equal`
  println(MyType(1) == MyType(2))
}

建议#

为需要实现的特征添加显式的 impl。由于 impl 可以用 .f(..) 语法调用,因此把方法迁移到 impl 是基本无害的,还能让代码的意图变得更清楚。

type MyType Int

impl Eq for MyType with op_equal(self, other) {
  self._ == other._
}

test {
  println(MyType(1) == MyType(2))
}