for文を利用した配列生成
for文(後述)を利用すると[1,3,5,7………101]といった配列も容易に生成できます。
arr = (num for num in [1...102] by 2)
サンプル
arr=[1,2,3,4,5]
arr=[1
2
3]
arr=[1...10]
arr=[12..10]
arr=(num for num in [1...102] by 2)
コンパイル結果
var arr;
arr = [1, 2, 3, 4, 5];
arr = [1, 2, 3];
arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr = [12, 11,10];
arr = (function() {
var _results;
_results = [];
for (num = 1; num < 102; num += 2) {
_results.push(num);
}
return _results;
})();
配列の範囲内の要素を取り出す
配列ARRの添え字がaからbまでの要素を持つ配列arrなどを簡単に作成できます。
arr = ARR[a..b]
arr = ARR[a...b]
arr = ARR[a..]
arr = ARR[..]
コンパイルすると
var arr;
arr = ARR.slice(a, (b+1) || 9e9);
arr=ARR.slice(a,b);
arr=ARR.slice(a);
arr=ARR.slice(0);
分割代入
Perlを知っている方なら関数の引数を受け取るときに
($a,$b,$c)=@_
という風に、左辺の配列に入れた変数に右辺の配列の値を順に書き込めることをご存じかと思います。CoffeeScriptでも同じ事が出来ます。
[a,b,c]=[10,20,30]
コンパイル
var a, b, c, _ref;
_ref = [10, 20, 30], a = _ref[0], b = _ref[1], c = _ref[2];
また、左辺の配列に入れる変数の一つだけ「...」を後ろにくっつけることが出来ます。
これを付けた変数は適切な長さを持つ配列が代入されます。
[a,b,c...,d]=[1...10]
コンパイル
var a, b, c, d, _i, _ref;
var __slice = Array.prototype.slice;
_ref = [1, 2, 3, 4, 5, 6, 7, 8, 9], a = _ref[0], b = _ref[1], c = 4 <= _ref.length ? __slice.call(_ref, 2, _i = _ref.length - 1) : (_i = 2, []), d = _ref[_i++];
これらは以下のように代入する値に配列の範囲指定や、深いネスト構造をしていてもきちんと代入がなされます
x = [11..20]
[ a, x[1...3], b ] = [1..10]
[ a, [ b, c...], [d], e] = [ 1, [1...10], [10..20], 5]
また、上のコンパイル結果を見ても分かるようにいったん_refという名前の変数に配列を入れてからa,b,cに値をコピーしているので、以下のような二つの値の交換も安全に実行できます。
a=10
b=0
[a,b] = [b,a]
コンパイル
var a, b, _ref;
a = 10;
b = 0;
_ref = [b, a], a = _ref[0], b = _ref[1];