3

CoffeeScriptソース

return sprite: myFunc
  width: 79
  height: 66
throw:
  from: {}
  last: {}

CoffeeScript1.1.1でコンパイル

return {
  sprite: myFunc({
    width: 79,
    height: 66
  }),
  "throw": {
    from: {},
    last: {}
  }
};

CoffeeScript1.3.3でコンパイル

return {
  sprite: myFunc({
    width: 79,
    height: 66
  })
};

({
  "throw": {
    from: {},
    last: {}
  }
});

これは私のコードを壊します。バージョン間の変更ログには何も表示されません。これはバグですか?

4

1 に答える 1

3

私はそれをバグと呼びますが、バグは1.1.1にあり、あいまいなコードの特定の解釈に依存するためにあなたのコードにありました。これ:

return sprite: myFunc
  width: 79
  height: 66
throw:
  from: {}
  last: {}

どのブロックが含まれるべきかについては少しあいまいかもしれませんthrowが、1.3.3の解釈だけが私にとって意味のあるものです。つまり、インデントが意図と一致しません。

わかりやすくするために関数ラッパーを追加する場合:

f = ->
  return sprite: myFunc
    width: 79
    height: 66
  throw:
    from: {}
    last: {}

次に、そこにあったわずかなあいまいさがなくなり、1.3.3の解釈が行われます。

f = ->
  return { sprite: myFunc(width: 79, height: 66) }
  { throw: { from: {}, last: {} } }

構造は次のバリエーションにすぎないため、完全に理にかなっています。

f = ->
  return pancakes
  eggs

中括弧と括弧、およびオプションでないものが禁止されているという意味ではありません。コード構造の一部の意図が一目で明らかでない場合は、中括弧と括弧を使用して構造を強制する必要があります。おそらく次のようになります。

return { sprite: myFunc
  width: 79
  height: 66
throw:
  from: {}
  last: {}
}

以上(IMO):

return {
  sprite: myFunc(
    width: 79
    height: 66
  )
  throw:
    from: {}
    last: {}
}

残念ながら、すべてのCoffeeScriptを読み、必要に応じて中括弧を追加する必要があります。非常に優れたテストスイートがあることを願っています。


興味深いことに、return:を削除すると

sprite: myFunc
  width: 79
  height: 66
throw:
  from: {}
  last: {}

次に、最新の解釈を取得します。

{
  sprite: myFunc(...)
  throw:  { from: ... }
}

それは次のように見えるので、私には完全に理にかなっています。

v =
  sprite: myFunc ...
  throw: ...

明示的には、暗黙的returnに存在しないコンテキストを導入します。return

于 2012-08-22T21:00:52.857 に答える