如何重载List类型的op_get操作?

如题,希望实现如下效果:

trait List {
  op_get(Self, Unit) -> Unit
}
// ...
fn init {
  let a = [1,2,3]
  let b = a[1]
  let c = a[(,2)]
  println(b==c)
}

最后输出结果为 true

List是ADT去做的,应该是不太好重载了,btw这种重载也很奇怪了吧

这个提问确实没有实际应用场景,乃是针对 数组下标从1开始 此topic的展开,偏娱乐向。
如果能使 a[,1]识别成a[(,1)],且a[(,1)]a[0]等价,那就不用去纠结下标了 :slight_smile:
就MoonBit而言个人是觉得没必要在语言层面实现这种多样性的,不过对于这个操作重载如何实现仍旧存有好奇

目前是做不到的。因为同一个类型(List)只能有一个同名方法,所以你想要的效果:

fn op_get[X](self: List[X], index: Int) -> Option[X]
fn op_get[X](selF: List[X], index: (, Int)) -> [X]

目前是会被拒绝的。因为同一个类型多个同名方法的重载会给类型系统加很多不必要的复杂度。

但如果你能接受 API 稍啰嗦一点的话:

fn get_from_zero[X](self: List[X], index: Int) -> Option[X]
fn get_from_one[X](self: List[X], index: Int) -> Option[X]
1 个赞