PseudoArrayを削除した

まつもとさんにも言及されたPseudoArray *1なのですが、悩んだ結果、なかったことにすることにしました。


止めた理由は次の通りです。

ary: "a".."z".each.with_index;
ary.map(|index, value| value ~ index.to_s).p;

このary.mapの呼び出しですが、mapはイテレータと配列*2両方で定義されているため、ユーザーが配列と期待してmapを呼んだのか、イテレータと期待してmapを呼んだのか判別がつきません。これでは結局to_aで明示的に配列に変換するという約束事が出来そうです。


あと、こんな使われ方が普通に動くのも気になります。

a: ["a": 0, "b": 1, "c": 2, "d": 3];
for(i: 0; i<a.size; ++i){
  a.keys[i].p;
  // PseudoArrayがある状態では、a.keys.to_a[i].p; と同じ意味となり、
  // 一時配列が毎ループ生成され、めちゃくちゃ遅くなる。
}

パッと見では普通のコードに見えてしまうので、気づきにくいです。

*1:最初はイテレータとして振舞うが、配列のメソッドを呼んだら配列として振舞う、という特殊なイテレータの仕様

*2:正確にはEnumeratorで