列表理解中的Coffeescript assoc数组语法

时间:2011-05-26 20:48:04

标签: associative-array list-comprehension coffeescript

大家好:我经常遇到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的多行关联数组语法的简洁方法而不会遇到此错误?谢谢你的帮助!

4 个答案:

答案 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的解决方法。