LoginSignup
5
5

More than 5 years have passed since last update.

CoffeeScript 1.4.0, 1.5.0, 1.6.1 の差異

Last updated at Posted at 2013-03-09

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);
5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5