22

Pythonの場合

def cross(A, B):
   "Cross product of elements in A and elements in B."
   return [a+b for a in A for b in B]

2つの配列(または文字列)で呼び出すと、1次元配列を返します。

しかし、CoffeeScriptでは

cross = (A, B) -> (a+b for a in A for b in B)

2次元配列を返します。

  1. それはCoffeeScriptの設計によるものだと思いますか、それともバグですか?
  2. CoffeScriptで配列をフラット化するにはどうすればよいですか?
4

2 に答える 2

17

まず、2つの配列内包表記はあまり維持しやすいパターンではないと言えます。それでは、少し分解してみましょう。

cross = (A, B) ->
  for a in A
    for b in B
      a+b

alert JSON.stringify(cross [1,2], [3,4])

ここで起こっていることは、内部が独自の理解コレクターを持つクロージャーを作成することです。したがって、すべてのbを実行し、結果を配列として返します。この配列は、親の理解結果コレクターにプッシュされます。少しファンキーな内部ループからの戻り値を期待しているようなものです。

代わりに、自分で結果を収集するだけです。

cross = (A, B) ->
  results = []
  for a in A
    for b in B
      results.push a + b
  results

alert JSON.stringify(cross [1,2], [3,4])

または、それでもクレイジーな理解の魔法をやりたい場合は、次のようにします。

cross = (A, B) ->
  results = []
  results = results.concat a+b for b in B for a in A
  results

alert JSON.stringify(cross [1,2], [3,4])

これがCSのバグであるかどうかは、少し議論の余地があると思います。ただし、ネストされたイテレータを処理する場合は、より明確な理解結果の処理を行うことをお勧めします。

于 2011-04-16T10:33:01.057 に答える
7

https://github.com/jashkenas/coffee-script/issues/1191

于 2011-04-16T10:27:39.090 に答える