Posted at

CoffeeScriptのfor文の注意点

More than 5 years have passed since last update.

CoffeeScriptで

for i in [0..n-1]

for j in [i+1..n-1]

って書くとこうコンパイルされる

for (i = _s = 0, _ref11 = n - 1; 0 <= _ref11 ? _s <= _ref11 : _s >= _ref11; i = 0 <= _ref11 ? ++_s : —_s) {

for (j = _t = _ref12 = i + 1, _ref13 = n - 1; _ref12 <= _ref13 ? _t <= _ref13 : _t >= _ref13; j = _ref12 <= _ref13 ? ++_t : —_t) {

そして

RangeError: Maximum call stack size exceeded

が出てしまった。

けどjsで普通に

for (i = 0; i < n; i++ ){

for ( j = i+1; j < n; j++ ){

書くと問題ない件。なにこれ?


coffeeのfor文がおかしい訳じゃない。

これの原因は、

for i in [0..n-1]

for j in [i+1..n-1]


[i+1..n-1]←これは右から左だけでなく、右から左にも動いていた!

つまり、

「i+1→n-1」の向き

「i+1←n-1」の向き

両方あったってこと!

途中まで→で動いてたのが

途中から←方向にループ回りだしてバグった。

if文で「i+1→n-1」の向きだけ通すようにしてやれば正常にうごく。

for i in [0..n-1]

for j in [i+1..n-1]`
if i+1 <= n-1