Как суммировать массив, если он больше заданного размера - PullRequest
0 голосов
/ 26 января 2020

У меня есть массив массивов:

a = [[1,2,3], [4,5,6], [7,8], [9]]

Я хочу только суммировать числа массива, длина которого больше 2.

Это не работает:

a.sum {|sub_a| sub_a.sum if sub_a.length > 2} 

потому что это привело к:

TypeError: nil can't be coerced into Integer from (pry):31:in `+'

Ответы [ 3 ]

3 голосов
/ 26 января 2020

Это потому, что ваше условие возвращает nil в противном случае, и sum вызывает + для этого. Вы можете попробовать с троичным оператором, возвращающим 0, если длина массива не превышает 2:

p [[1,2,3], [4,5,6], [7,8], [9]].sum { |e| e.length > 2 ? e.sum : 0 }
# 21
1 голос
/ 26 января 2020

Поскольку sum ожидает, что результатом блока будет целое число, результат может быть не нулевым, следовательно, ошибка. Помимо решения @Sebastian Palma вы также можете использовать Enumerable#inject, что может быть немного более явным:

a.inject(0) {|total, el| el.length > 2 ? total + el.sum : total }

inject имеет то преимущество, что доступно в Ruby версии до 2.4. Однако в предложенном решении в блоке используется sum, поэтому это решение по-прежнему зависит от доступности Enumerable#sum.

1 голос
/ 26 января 2020

Попробуйте a.select { |sub_a| sub_a.count >= 2 }.sum


Не пытайтесь это сделать. Попробуйте:

a.select { |sub_a| sub_a.count > 2 }.flatten.sum

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...