Ruby удаляет значения nil из массива с .reject
У меня есть массив:
scores = [1, 2, 3, "", 4]
И я хочу удалить все пустые значения. Но когда я запускаю это:
puts scores.reject(&:empty?)
Я получаю сообщение об ошибке:
undefined method `empty' for 1:Fixnum
Как я могу удалить значения, которые не являются целыми числами из моего массива в одноэтапном процессе? Я использую Ruby 1.9.3.
Ответы
Ответ 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?
будет работать нормально по этой причине.