coffeescript では、次のようにできます。
rows = [
{a: 1}
{b: 2}
]
for row in rows
for k,v of row
alert "#{k}: #{v}"
では、なぜこのようにできないのでしょうか?:
for k,v of row for row in rows
alert "#{k}: #{v}"
coffeescript では、次のようにできます。
rows = [
{a: 1}
{b: 2}
]
for row in rows
for k,v of row
alert "#{k}: #{v}"
では、なぜこのようにできないのでしょうか?:
for k,v of row for row in rows
alert "#{k}: #{v}"
そのようにすることはできませんが、内側のループを反転して、式の後にループ構造を配置することはできます。
for row in rows
alert "#{k}: #{v}" for k,v of row
そして、その内側のループも式なので、同じ方法で外側のループを反転することもできます:D
alert "#{k}: #{v}" for k,v of row for row in rows
あなたが書き込もうとしていたものに最も似ているのはおそらくこれです:
for row in rows then for k,v of row
alert "#{k}: #{v}"
これは、別のものを使用してさらにインライン化できますthen
(then
キーワードは通常、改行と1つのレベルのインデントを追加することと同等です):
for row in rows then for k,v of row then alert "#{k}: #{v}"
これらの選択肢はすべて同じJSコードを生成するため、どちらかを選択しても、パフォーマンスの低下などは発生しません:D
実行しようとするとfor k,v of row for row in rows
、行 1: Unexpected 'FOR' で Parse error が発生します。
これは、 の前に何かを置いた瞬間、それは式for row in rows
でなければならず、そうではないからです。これは、接頭辞付きのループを実際の式にすることで確認できます。for k,v of row
row for k,v of row for row in rows
これはコンパイルされます。したがって、 を反復処理するために後置形式を使用したのと同じ方法でrows
、内側のものを後置する必要があります。
alert "#{k}: #{v}" for k,v of row for row in rows
then
必要な分離を実現するには、後置式を使用する代わりに、改行を置き換えるために使用する必要があります。
for row in rows then for k,v of row
alert "#{k}: #{v}"
その複合構文は Coffeescript 言語の一部ではないためです。プログラミング言語は、人間の言語ほど流動的ではありません。