2011-05-26 1 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の複数行assoc配列構文を理解の中に入れますか?ご協力いただきありがとうございます!

答えて

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

はい、これは明らかに問題の要点です。バグレポートへのリンクありがとうございます。 – drcode

2

私は答えを数回変えましたが、最初の例の問題は、coffeescriptコンパイラがfoo:が構築したいオブジェクトであり、quxになるときに気になるオブジェクトだと思うことです。それはfooとは違ったものだと考えています。興味深いのは、JSONスタイルの中括弧を使用して、JSONスタイルの中括弧を使用して、オブジェクト定義の境界を明示的に宣言し、境界内でYAMLを読みやすくすることです。

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

ありがとう、これは私がやることです。 (しかし、私はTrevorを正しい答えとして宣言しなければなりませんでした。なぜなら、彼は実際にこれについてのバグ報告を見つけました。しかし、私はあなたにポイントを与えました:-) – drcode

+0

thats fair!私は、たとえバグが修正されたとしても、中括弧なしでオブジェクトを宣言できるかどうかはわかりません。その構文は私を混乱させる。それはただ奇妙に見えます。 – c3rin

3

.map()がここにあなたの友達です:

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

(私はあなたの問題は、実際にバグである知っているが、これはIMOより理にかなっているリストの内包。

+0

ええ、それは良いアイデアです - ポインタのおかげで。 – drcode

0

私の通常の解決方法は次のとおりです。

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

変数を設定すると、設定されている値が返されます。それはまだちょっとハッキリですが、設定した後に明示的にgを返すあなたのバージョンより少し上手です。しかし、間違いなくcoffeescriptバグの回避策です。