Вложенные массивы в CoffeeScript - PullRequest
22 голосов
/ 16 апреля 2011

В 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?

Ответы [ 2 ]

17 голосов
/ 16 апреля 2011

Во-первых, я бы сказал, что два массива в строке не очень понятный шаблон.Итак, давайте немного разберемся с этим.

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 или нет, это немного спорно, я полагаю.Но я бы сказал, что при работе с вложенными итераторами рекомендуется выполнять более явную обработку результатов понимания.

7 голосов
/ 16 апреля 2011
...