論標準庫的重複代碼!

隨便用 Array、String、Map 擧個例子。
先看Array:

pub fn Array::fold[A, B](self : Array[A], init~ : B, f : (B, A) -> B) -> B {
  for i = 0, acc = init; i < self.length(); {
    continue i + 1, f(acc, self[i])
  } else {
    acc
  }
}

再看String:

pub fn fold[A](self : String, init~ : A, f : (A, Char) -> A) -> A {
  let mut rv = init
  for c in self {
    rv = f(rv, c)
  }
  rv
}

接下來是Map,需要先 .iter()

pub fn Iter::fold[T, B](self : Iter[T], init~ : B, f : (B, T) -> B) -> B {
  let mut acc = init
  for a in self {
    acc = f(acc, a)
  }
  acc
}

我想問,這難道不是重複代碼嗎?爲什麽相同的功能用了三套代碼實現?

这三个 foldfor .. in 内部是不同的东西。如果要统一处理那相当于都转成 Iter 再用 Iter::fold,但这样做会有性能开销。想要零开销地共享这三分代码会需要一个单独的 trait 和更复杂的类型,考虑到这三个函数都很简单,我们认为保持类型签名的简洁易懂在这里更重要一些