问题描述
|
大家好:我经常遇到以下关于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多行assoc数组语法的干净方法而不会遇到此错误?谢谢你的帮助!
解决方法
所以,
k=for x in [0...3]
foo:
bar:x
baz:3
qux:5
无法编译,但是
func
foo:
bar:x
baz:3
qux:5
(例如)正确编译。我相信这是CoffeeScript解析器中的一个已知错误。不幸的是,由于解析YAML样式的对象变得异常棘手,因此存在一些类似的问题。所以现在,我将使用显式花括号,如c3rin所建议的。
[编辑:具体参见问题981。]
,.map()
是您的朋友在这里:
k = [0...3].map (i) ->
foo:
bar: \"#{i}\"
baz: i
qux: i*3
(我知道您的问题实际上是一个错误,但这在IMO中更有意义。列表理解更适合于简单的任务)
,我已经改变了几次答案,但是我认为第一个示例的问题是coffeescript编译器认为foo:是您要构建的对象,并且在进入qux时会感到担忧:因为它认为它是a与foo完全不同的对象。有趣的是,您可以混合JSON样式和YAML样式的声明,使用JSON样式的花括号显式声明对象定义的边界,并在边界内部使用YAML以获得可读性。
{
foo:
bar:x
baz:3
qux:5
}
,我通常的解决方案如下:
k = for x in [0...3]
g =
foo:
bar:x
baz:3
qux:5
设置变量将返回其设置值。它仍然有些古怪,但是比您的版本好一点,后者在设置后显式返回g
。不过,绝对可以解决coffeescript错误。