Yanıtlar:
Bunu yapmanın birçok yolu var, biri reject
noEmptyCities = cities.reject { |c| c.empty? }
Ayrıca reject!, citiesyerinde değişiklik yapacak olan kullanabilirsiniz . Bir citiesşey reddedilirse veya nilherhangi bir ret yapılmazsa dönüş değeri olarak geri döner . Dikkatli değilseniz bu bir gotcha olabilir (yorumlarda bunu belirttiği için ninja08'e teşekkürler).
cities.reject!(&:blank?)? empty?diziler için
blank?yalnızca üzerinden kullanılabilir ActiveSupport. Standart Ruby şunları kullanır String#empty?: ruby-doc.org/core-1.9.3/String.html#method-i-empty-3F
rejectdaha iyi olduğu reject!, çünkü [].reject!(&:empty?)döner nil, [].reject(&:empty?)iadeler[]
1.9.3p194 :001 > ["", "A", "B", "C", ""].reject(&:empty?)
=> ["A", "B", "C"]
blank?iyi bir seçim ama onun bir railsyöntem ve bu soru ova ile ilgiliruby
İşte benim için işe yarayan:
[1, "", 2, "hello", nil].reject(&:blank?)
çıktı:
[1, 2, "hello"]
:blank?özgü olduğunu fark etmemdeki sorun buydu .
NoMethodError: undefined method empty? for nil:NilClass, :blank? daha iyi:empty?
:blankdaha iyi çalışır :empty. Çünkü :emptyçalışmıyornil
Ben böyle bir dizi derlemek istediğinizde kullanıyorum:
["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - ["", nil]
Bu, tüm boş veya sıfır öğelerini kaldıracaktır.
cities.delete_if(&:blank?)
Bu, hem nildeğerleri hem de boş dize ( "") değerlerini kaldıracaktır .
Örneğin:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal", nil]
cities.delete_if(&:blank?)
# => ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Bunu dene:
puts ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"] - [""]
Kullanım reject:
>> cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].reject{ |e| e.empty? }
=> ["Kathmandu", "Pokhara", "Dharan", "Butwal"]
reject(&:empty?),.
nil.empty?booom molası!
reject(&:empty?)birlikte compactörneğin[nil, ''].compact.reject(&:empty?)
cities.reject! { |c| c.blank? }
Kullanmak istediğiniz sebebi blank?üzerinde empty?o boş nil, boş dizeleri ve beyaz boşluk tanır olduğunu. Örneğin:
cities = ["Kathmandu", "Pokhara", " ", nil, "", "Dharan", "Butwal"].reject { |c| c.blank? }
yine de dönecekti:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Ve çağrı yapmak empty?, muhtemelen olmak istediğiniz " "geri dönecektir .falsetrue
Not: blank?yalnızca Rails üzerinden erişilebilir, Ruby yalnızca destekler empty?.
Zaten çok fazla cevap var ama burada Rails dünyasındaysanız başka bir yaklaşım var:
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"].select &:present?
present?geliyor ActiveSupport. Bu bir Rails etiketi vardır ve bir yöntem için ekstra bir mücevher gerektiren aşırı görünüyor.
İşte bunu başarmak için bir yaklaşım daha
presenceile kullanabilirizselect
cities = ["Kathmandu", "Pokhara", "", "Dharan", nil, "Butwal"]
cities.select(&:presence)
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
" "Dizimde reddetme yöntemi ile kaldırılmayan bazı öğeler vardı . Yönteminiz kaldırıldı nil ""veya " "öğeler.
En kısa yol cities.select(&:present?)
diğer yöntem:
> ["a","b","c","","","f","g"].keep_if{|some| some.present?}
=> ["a","b","c","f","g"]
join& İle katı bir şekilde güncelleyinsplit
cities = ["Kathmandu", "Pokhara", "", "Dharan", "Butwal"]
cities.join(' ').split
Sonuç:
["Kathmandu", "Pokhara", "Dharan", "Butwal"]
Unutmayın: bu, boşlukları olan bir şehirle çalışmaz
cities.reject!(&:empty?)