Nested array comprehensions in CoffeeScript

后端 未结 2 536
情深已故
情深已故 2021-02-12 11:02

In 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]

returns an one-dimen

2条回答
  •  粉色の甜心
    2021-02-12 11:35

    First I would say say that 2 array comprehensions in line is not a very maintainable pattern. So lets break it down a little.

    cross = (A, B) ->
      for a in A
        for b in B
          a+b
    
    alert JSON.stringify(cross [1,2], [3,4])
    

    What's happening here is that the inner creates a closure, which has its own comprehension collector. So it runs all the b's, then returns the results as an array which gets pushed onto the parent comprehension result collector. You are sort of expecting a return value from an inner loop, which is a bit funky.

    Instead I would simply collect the results myself.

    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])
    

    Or if you still wanted to do some crazy comprehension magic:

    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])
    

    Whether this is a bug in CS or not is a bit debatable, I suppose. But I would argue it's good practice to do more explicit comprehension result handling when dealing with nested iterators.

提交回复
热议问题