gpt4 book ai didi

Coffeescript 在 1.1.1 和 1.3.3 之间呈现不同

转载 作者:行者123 更新时间:2023-12-04 04:54:57 24 4
gpt4 key购买 nike

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.1.1 和您的代码中,具体取决于对不明确代码的特定解释。这:

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

对于 block 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: {}
}

或更好(海事组织):

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 时不存在的上下文。

关于Coffeescript 在 1.1.1 和 1.3.3 之间呈现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12080680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com