大家好:我经常遇到coffeescript的以下问题,并且想知道是否有人知道解决方案。请考虑以下代码:
k=for x in [0...3]
{foo:{bar:x,baz:3},qux:5}
我有很多具有这种基本布局的代码。但是,很难阅读。以下列方式编写此代码会更清晰:
#Gives Error- PARSE ERROR ON LINE 5: UNEXPECTED 'TERMINATOR'
k=for x in [0...3]
foo:
bar:x
baz:3
qux:5
这个错误可以通过以下黑客来规避,这看起来很难看:
k=for x in [0...3]
g=
foo:
bar:x
baz:3
qux:5
g
有没有人知道在理解中使用Coffeescript的多行关联数组语法的简洁方法而不会遇到此错误?谢谢你的帮助!
答案 0 :(得分:3)
所以,
k=for x in [0...3]
foo:
bar:x
baz:3
qux:5
无法编译,但
func
foo:
bar:x
baz:3
qux:5
(例如)正确编译。我相信这是CoffeeScript解析器中的已知错误。不幸的是,有几个类似的问题是开放的,因为解析YAML风格的对象已经证明是非常棘手的。所以现在,我会使用明确的花括号,正如c3rin所暗示的那样。
[修改:具体见issue 981。]
答案 1 :(得分:3)
.map()
是你的朋友:
k = [0...3].map (i) ->
foo:
bar: "#{i}"
baz: i
qux: i*3
(我知道你的问题实际上是一个错误,但这更有意义IMO。列表推导更适合于简单的任务)
答案 2 :(得分:2)
我已经改变了我的答案了几次,但我认为你的第一个例子的问题是coffeescript编译器认为foo:是你想要构建的对象,并且当它到达qux时会担心:因为它认为它与foo完全不同。有趣的是,您可以混合使用JSON样式和YAML样式的声明,使用JSON样式的花括号来显式声明对象定义的边界,并在边界内使用YAML以便于阅读。
{
foo:
bar:x
baz:3
qux:5
}
答案 3 :(得分:0)
我通常的解决方案如下:
k = for x in [0...3]
g =
foo:
bar:x
baz:3
qux:5
设置变量将返回其设置的值。它仍然有点hacky,但比你设置它后显式返回g
的版本稍微好一些。但绝对是coffeescript bug的解决方法。