1.4.0, 1.5.0 ではコンパイルが通るコード.
a.coffee
f = (obj1, obj2) ->
console.log obj1.x
console.log obj2.y
f {x: 1}
y: 2
引数として Object を 2 つ受け取る関数を呼び出す際のコードです.これコンパイルが通るんですよね.よく考えてみると変な気がしますけど.
最後の引数が Object の場合は {}
を外せる,インデントによって Object の内容を記載していける,関数呼び出しに ()
が必要ない,という仕様が交じり合ったときの不整合というか何と言うか.
ちなみにコンパイルは通るんですけど,コンパイル結果が,1.4.0 と 1.5.0 とでは違います.
コンパイルは最も単純に coffee -c a.coffee
で行います.
1.4.0でコンパイル
// Generated by CoffeeScript 1.4.0
(function() {
var f;
f = function(obj1, obj2) {
console.log(obj1.x);
return console.log(obj2.y);
};
f({
x: 1
}, {
y: 2
});
}).call(this);
1.5.0でコンパイル
// Generated by CoffeeScript 1.5.0
(function() {
var f;
f = function(obj1, obj2) {
console.log(obj1.x);
return console.log(obj2.y);
};
f({
x: 1
})({ // ← ここが違います このまま実行するとエラーですね
y: 2
});
}).call(this);
このコードが,1.6.1 ではコンパイルエラーを起こすように変わったようです.
以下のように修正しましょう.
b.coffee
f = (obj1, obj2) ->
console.log obj1.x
console.log obj2.y
f {x: 1},
y: 2
{x: 1}
の後にきちんとコンマをつけましょう.これで 1.4.0 でコンパイルした結果と同じコードが得られます.
1.6.1でコンパイル
// Generated by CoffeeScript 1.6.1
(function() {
var f;
f = function(obj1, obj2) {
console.log(obj1.x);
return console.log(obj2.y);
};
f({
x: 1
}, {
y: 2
});
}).call(this);