Ответы:
Есть много способов сделать это, один reject
noEmptyCities = cities.reject { |c| c.empty? }
Вы также можете использовать reject!, который будет изменять citiesна месте. Он либо вернет citiesсвое возвращаемое значение, если он что-то отклонил, либо nilесли отклонения не сделаны. Это может быть ошибкой, если вы не будете осторожны (спасибо ninja08 за то, что отметили это в комментариях).
cities.reject!(&:blank?)? empty?для массивов
blank?доступен только через ActiveSupport. Стандартный Ruby использует String#empty?: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
rejectлучше чем reject!потому что [].reject!(&:empty?)возвращается nil, [].reject(&:empty?)возвращается[]
Вот что работает для меня:
[1, "", 2, "hello", nil].reject(&:blank?)
вывод:
[1, 2, "hello"]
:blank?, специфичной для Rails.
NoMethodError: undefined method empty? for nil:NilClass, :blank? лучше:empty?
:blankработает лучше чем :empty. Потому :emptyчто не работает дляnil
Когда я хочу привести в порядок массив, я использую:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
Это удалит все пустые или нулевые элементы.
cities.delete_if(&:blank?)
Это удалит как nilзначения, так и пустые значения string ( "").
Например:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Попробуй это:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
Используйте reject:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
reject(&:empty?).
nil.empty?бум перерыв!
reject(&:empty?)с , compactнапример[nil, ''].compact.reject(&:empty?)
cities.reject! { |c| c.blank? }
Причина, по которой вы хотите использовать blank?более, empty?заключается в том, что пробел распознает ноль, пустые строки и пробелы. Например:
cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
все равно вернется
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
И , призвав empty?на " "ВЕРНЕТСЯ false, который вы , вероятно , хотите быть true.
Примечание: blank?доступно только через Rails, Ruby поддерживает только empty?.
Ответов уже много, но вот другой подход, если вы находитесь в мире Rails:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
present?приходит от ActiveSupport. У него нет тега Rails, и требование дополнительного гема для одного метода кажется чрезмерным.
Вот еще один подход для достижения этой цели
мы можем использовать presenceсselect
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
" "В моем массиве были некоторые элементы, которые не были удалены с помощью метода отклонения. Ваш метод удален nil ""или " "элементы.
Кратчайший путь cities.select(&:present?)
другой метод:
> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]
Обновление со строгим с join&split
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split
Результат будет:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Обратите внимание: это не работает с городом с пробелами
cities.reject!(&:empty?)