2011-05-26 34 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略微更好。不過,這絕對是一個解決咖啡腳本錯誤的方法。