Ответы:
Есть много способов сделать это, один 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?)