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]

如果您使用两个数组(或字符串)调用它,则返回一个一维数组。

但是在 CoffeeScript 中

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

返回一个二维数组。

  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 回答