2011-05-26 35 views
2

大家好:我经常跑与CoffeeScript的以下问题,如果有人解决方案的知道不知道。考虑下面的代码:CoffeeScript的assoc命令数组语法

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的多行关联数组语法在理解的内部没有遇到这个错误?谢谢你的帮助!

回答

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特别]

+0

是的,这显然是完全发出─感谢您的链接到bug报告的症结所在。 – drcode 2011-05-27 12:03:56

2

我已经改变了我的答案了几次,但我认为你的第一个例子的问题是,CoffeeScript的编译器认为富:是要建立和关注,当它到达qux对象:因为它认为它与foo完全不同。有趣的是,你可以使用JSON风格的大括号显式声明的对象定义的边界混合JSON风格和YAML式的声明,以及边界可读性内使用YAML。

{ 
    foo: 
    bar:x 
    baz:3 
    qux:5 
} 
+0

Thanks-这就是我要做的。 (但是我不得不声明Trevor是正确的答案,因为他实际上找到了这个错误报告,但我给了你一个观点:-) – drcode 2011-05-27 12:04:22

+0

这就是公平!即使错误得到解决,我甚至不能确定我可以在没有大括号的情况下声明一个对象。那句话令我困惑。它看起来很奇怪。 – c3rin 2011-05-27 16:16:50

3

.map()是你的朋友在这里:

k = [0...3].map (i) -> 
    foo: 
     bar: "#{i}" 
     baz: i 
    qux: i*3 

(我知道你的问题实际上是一个错误,但是这使得更多的意义IMO列表解析更适合于简单的任务)

+0

是的,这是一个好主意 - 感谢指针。 – drcode 2011-05-30 20:17:17

0

我通常的解决方案如下:

k = for x in [0...3] 
    g = 
     foo: 
     bar:x 
     baz:3 
     qux:5 

设置一个变量返回它被设置为值。它还是有点哈克,但比你的版本,它设定明确后返回g略微更好。不过,这绝对是一个解决咖啡脚本错误的方法。