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

Ruby удаляет значения nil из массива с .reject

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

scores = [1, 2, 3, "", 4]

И я хочу удалить все пустые значения. Но когда я запускаю это:

puts scores.reject(&:empty?)

Я получаю сообщение об ошибке:

undefined method `empty' for 1:Fixnum

Как я могу удалить значения, которые не являются целыми числами из моего массива в одноэтапном процессе? Я использую Ruby 1.9.3.

4b9b3361

Ответ 1

Это так же просто, как:

scores.grep(Integer)

Обратите внимание, что если вы планируете сопоставлять значения, вы можете сделать это в блоке после:

scores.grep(Integer){|x| x+1 }

Бонус, если вы хотите сделать то же самое, но ваши номера - это строки:

scores.grep(/\d+/){|x|x.to_i}

Ответ 2

Отклонить только nil будет:

array.compact

Ответ 3

Если вы хотите удалить пустые значения, вы должны использовать blank?: (требуется Rails/ActiveSupport)

scores.reject(&:blank?)
#=> [1, 2, 3, 4]

"", " ", false, nil, [] и {} пусты.

Ответ 4

Попробуйте следующее:

scores.select{|e| e.is_a? Integer}
# => [1, 2, 3, 4]

Ответ 5

scores = [1, 2, 3, "", 4, nil]
scores.reject{|s| s.to_s == ''}
# => [1, 2, 3, 4]

Ответ 6

Это работало для меня

scores.reject!{|x| x.to_s.empty?}

Ответ 7

Если вам действительно нужно отклонить nil, так что это можно сделать следующим образом:

scores.reject(&:nil?)

Ответ 8

scores.select{|score| score.is_a? Fixnum}

или, поскольку Fixnum наследует от Integer, вы также можете перейти на

scores.select{|score| score.is_a? Integer)

... если это кажется более описательным.

Array и Enumerable имеют тенденцию предлагать множество способов сделать то же самое.

Ответ 9

&:empty? будет работать для хэшей, массивов и строк, но не для чисел. Метод, который вы используете в reject, должен быть действительным для всех элементов в списке. &:blank? будет работать нормально по этой причине.