R.I.P foreach_reverse
foreach_reverseが消える.で,通常のRangeはretroで反転できるので何の問題もないけど,opApplyはどうすればいいのん?という.
auto myretro(Range)(Range range) { static if (__traits(compiles, range.opApplyReverse)) return &range.opApplyReverse; else return retro(range); }
今ラッパー書くならこんな感じ?こうすれば
class Foo { int[] array; this(int[] array) { this.array = array; } int opApply(int delegate(ref int) dg) { int result; for (uint i; i < array.length; i++) { result = dg(array[i]); if (result) break; } return result; } int opApplyReverse(int delegate(ref int) dg) { int result; for (uint i = array.length; i > 0; i--) { result = dg(array[i - 1]); if (result) break; } return result; } } void main() { auto foo = new Foo([1, 2]); foreach (elem; foo) { writeln(elem); } foreach (elem; myretro(foo)) { writeln(elem); } }
でも一応ちゃんと動く.しかし今までそうして来たとはいえ「Rangeインターフェイスを満たせばretroで逆走査できる」に比べopApplyReverseを毎回定義するのは面倒に感じる.しかしあくまでシンタックスシュガーのopApply(Reverse)をRangeが全て満たしてないのも事実(foreach (a, b, c; range) {}とか出来ない).Andreiはどうするつもりなんだろうか…