Coffeescript在1.1.1和1.3.3之间呈现不同

时间:2012-08-22 20:12:57

标签: coffeescript

CoffeeScript来源

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

使用CoffeeScript 1.1.1编译

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

使用CoffeeScript 1.3.3编译

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

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

这破坏了我的代码。我在版本之间的更改日志中看不到任何内容。这是一个错误吗?

1 个答案:

答案 0 :(得分: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时不存在的上下文。