CoffeeScript中的嵌套数组解析

Jon*_*röm 22 list-comprehension coffeescript

在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]
Run Code Online (Sandbox Code Playgroud)

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

但在CoffeeScript中

cross = (A, B) -> (a+b for a in A for b in B)
Run Code Online (Sandbox Code Playgroud)

返回一个二维数组.

  1. 你认为这是CoffeeScript的设计还是一个bug?
  2. 如何在CoffeScript中展平数组?

Ale*_*yne 17

首先我要说的是,2行阵列理解不是一个非常可维护的模式.所以让我们分解一下吧.

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

alert JSON.stringify(cross [1,2], [3,4])
Run Code Online (Sandbox Code Playgroud)

这里发生的是内在创造一个闭包,它有自己的理解收集器.所以它运行所有的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])
Run Code Online (Sandbox Code Playgroud)

或者如果你还想做一些疯狂的理解魔法:

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])
Run Code Online (Sandbox Code Playgroud)

我想,这是否是CS中的错误有点值得商榷.但我认为在处理嵌套迭代器时进行更明确的理解结果处理是一种好习惯.

  • "首先我要说的是,2行阵列理解不是一种非常可维护的模式." - 告诉Peter Norvig :) http://norvig.com/sudoku.py (3认同)