#coffeescript #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]
возвращает одномерный массив, если вы вызываете его с двумя массивами (или строками).
Но в CoffeeScript
cross = (A, B) -> (a b for a in A for b in B)
возвращает двумерный массив.
- Как вы думаете, это сделано специально в CoffeeScript или это ошибка?
- Как мне сгладить массивы в CoffeScript?
Комментарии:
1. Это еще не решено github.com/jashkenas/coffee-script/issues/1191
Ответ №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 или нет, немного спорно. Но я бы сказал, что хорошей практикой является более явная обработка результатов понимания при работе с вложенными итераторами.
Комментарии:
1. «Сначала я бы сказал, скажем, что 2 понимания массива в строке like — это не очень поддерживаемый шаблон». — скажите это Питеру Норвигу 🙂 norvig.com/sudoku.py
2. Было бы неплохо, если бы в синтаксис была добавлена поддержка сглаженных результатов. Например, в синтаксис может быть введена запятая —
a b for a in A,b in B
Ответ №2:
Комментарии:
1. джашкенас повторно открыл проблему 13 сентября 2011