Подтвердить что ты не робот

Вложенные массивы в 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]

возвращает одномерный массив, если вы вызываете его двумя массивами (или строками).

Но в CoffeeScript

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

возвращает двумерный массив.

  • Считаете ли вы это по дизайну в CoffeeScript или это ошибка?
  • Как сгладить массивы в CoffeScript?
4b9b3361

Ответ 1

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