3

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: {}
  }
});

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

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 回答