Ruby'de bir String'in Nil veya Length == 0 değerini kontrol etmenin daha iyi bir yolu var mı?


169

Bir dizenin nil VEYA Ruby'de 0 uzunluğu olup olmadığını kontrol etmek için aşağıdakilerden daha iyi bir yol var mı?

if !my_string || my_string.length == 0
  return true
else
  return false
end

C # 'da kullanışlı

string.IsNullOrEmpty(myString)

Ruby'de buna benzer bir şey var mı?


16
Bunun gibi bir if ifadesine sahip olmak gereksizdir: "if (koşul) sonra true else false". Koşulun kendisi if-ifadesiyle aynı gerçekliğe sahiptir.
KaptajnKold

my_string || my_string.length == 0Bir zam olacak NoMethodErroreğer my_stringsıfırdır. Sanırım demek my_string.nil? || my_string.length == 0
istedin

1
Olmalı!my_string || my_string.length == 0
levsa

Yanıtlar:


224

Performans konusunda endişelenmediğimde, bunu sıklıkla kullanacağım:

if my_string.to_s == ''
  # It's nil or empty
end

Elbette çeşitli varyasyonlar var ...

if my_string.to_s.strip.length == 0
  # It's nil, empty, or just whitespace
end

2
Kullanılan varyasyon stripoldukça verimsiz olabilir.
Marc-André Lafortune

10
bir başka ilginç yol ise my_string.to_s.empty?
Ricardo Pessoa

Çoğu insan için ilk seçenek tamamen kabul edilebilir ve iyi okunur.
Ocak'ta amrcus

68

ActiveSupport'a gereksinim duyarsanız, sadece #blank?NilClass ve String için tanımlanan yöntemi kullanabilirsiniz .


15
Yalnızca boşluk içeren bir Dize'nin hala boş kabul edildiğini unutmayın. Yani "" .blank? doğru.
Grant Hutchins

2
Ayrıca, boolean false, {} ve [] boş olarak kabul edilir. Yani {} .blank ?, [] .blank ?, false.blank? hepsi doğru olarak değerlendirilir.
ShaharZ

64

Bunu aşağıdaki gibi yapmak istiyorum (bir Rails / ActiveSupport ortamında):

variable.to_s.empty?

bu çalışır çünkü:

nil.to_s == ""
"".to_s == ""

3
İyi bir açıklama neden string.to_s.empty?ikisi için çalışır nilve "".
georger

31

Jcoby'nin teklifine bir alternatif:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end

10
Ama .. ama .. Yakut çekirdek kütüphanesi bunu zaten uygular. nil.to_s => "", yani thing.to_s == "" diyebilirsiniz
DigitalRoss

1
@DigitalRoss Bu, hafif bir performans sorunu olabilecek veya olmayabilecek dize dönüşümünü önler.
Vortico

30

Burada daha önce söylendiği gibi Rails (ActiveSupport) kullanışlı bir boşluğa sahip mi? yöntemi ve bu şekilde uygulanır:

class Object
  def blank?
    respond_to?(:empty?) ? empty? : !self
  end
end

Herhangi bir yakut tabanlı projeye eklemek oldukça kolaydır.

Bu çözümün güzelliği, sadece Dizeler için değil, Diziler ve diğer türler için de otomatik büyülü bir şekilde çalışmasıdır.


15

variable.blank? yapacağım. Dize boşsa veya dize nil ise true değerini döndürür.


12
Aslında, bu sadece raylar uzatma, saf yakut değil. Ancak raylar kullanıyorsanız çok kullanışlıdır!
James P McGrath

13

nil?boole bağlamlarında atlanabilir. Genellikle, bunu C # kodunu çoğaltmak için kullanabilirsiniz:

return my_string.nil? || my_string.empty?

7

Her şeyden önce, bu yönteme dikkat edin:

As Jesse Ezel diyor ki:

Brad Abrams

"Yöntem uygun görünebilir, ancak çoğu zaman bu durumun daha derin hataları örtmeye çalışmaktan kaynaklandığını gördüm.

Kodunuz, dizelerin kullanımıyla ilgili belirli bir protokole bağlı kalmalı ve protokolün kütüphane kodunda ve birlikte çalıştığınız kodda kullanımını anlamalısınız.

NullOrEmpty protokolü genellikle hızlı bir çözümdür (bu yüzden gerçek sorun hala başka bir yerde ve kullanımda iki protokol var) veya yeni bir kod uygularken belirli bir protokolde uzmanlık eksikliği var (ve yine, gerçekten ne olduğunu bilmelisiniz) dönüş değerleriniz). "

String sınıfını eklerseniz ... NilClass'ın da yama olmadığından emin olun !

class NilClass
    def empty?; true; end
end

5

Her sınıfın bir nil?yöntemi vardır:

if a_variable.nil?
    # the variable has a nil value
end

Ve dizeler empty?yöntemi var:

if a_string.empty?
    # the string is empty
}

Bir dizenin boşken eşit olmadığını unutmayın nil, bu nedenle empty?dizenin boş olup olmadığını kontrol etmek için yöntemi kullanın.


4

Başka bir seçenek, nil'i anında boş bir sonuca dönüştürmektir:

(my_string||'').empty?


2

Konrad Rudolph doğru cevabı veriyor.

Eğer gerçekten sizi rahatsız ediyorsa, dize sınıfını yamalı ya da seçtiğiniz bir sınıfa / modüle ekleyin. Gerçi gerçekten zorlayıcı bir nedeniniz yoksa, yama çekirdek nesnelerini maymunlamak gerçekten iyi bir uygulama değildir.

class String
  def self.nilorempty?(string)
    string.nil? || string.empty?
  end
end

Sonra yapabilirsin String.nilorempty? mystring


2

NameError İstisnalarından Kaçınırken Düz Ruby'de Boş Dizeleri Kontrol Edin

Burada bazı iyi yanıtlar var, ancak burada yaygın kullanım örneğini ele almak için ActiveSupport veya maymun yaması gerekmez. Örneğin:

my_string.to_s.empty? if defined? my_string

Bu ise "doğru olanı yapmak" olacak my_string nil veya boş bir dize, ancak yükseltmez NameError istisna eğer my_string tanımlı değil. Bu genellikle daha fazla düşünülenlere tercih edilir:

my_string.to_s.empty? rescue NameError

ya da daha ayrıntılı ilk, çünkü yapmadığınız şeyler için istisnalar gerçekten kaydedilmelidir olmasını bekliyoruz. Bu durumda, bu yaygın bir hata olsa da, tanımsız bir değişken gerçekten istisnai bir durum değildir, bu nedenle buna göre ele alınmalıdır.

Kilometreniz değişebilir.


1

Ayrıntılandırmayı denediniz mi?

module Nothingness
  refine String do
    alias_method :nothing?, :empty?
  end

  refine NilClass do
    alias_method :nothing?, :nil?
  end
end

using Nothingness

return my_string.nothing?

1

Ray kullanıyorsanız, #present?

require 'rails'

nil.present?  # ==> false (Works on nil)
''.present?    # ==> false (Works on strings)
'  '.present?  # ==> false (Works on blank strings)
[].present?    # ==> false(Works on arrays)
false.present? # ==> false (Works on boolean)

Yani, tersine sıfır veya sıfır uzunluk kullanımını kontrol etmek !present?

!(nil.present?)  # ==> true
!(''.present?)    # ==> true
!('  '.present?)  # ==> true
!([].present?)    # ==> true
!(false.present?) # ==> true

0

Raylarda deneyebilirsiniz #blank?.

Uyarı: string boşluklardan oluştuğunda size pozitiflik verir:

nil.blank? # ==> true
''.blank? # ==> true
'  '.blank? # ==> true
'false'.blank? # ==> false

Sadece belirtmek istedim. Belki ihtiyaçlarınızı karşılar

UPD. neden feed'imde eski sorular alıyorum? Necroposting için özür dilerim.


0

Kod golfçüler için:

if my_string=~/./
  p 'non-empty string'
else
  p 'nil or empty string'
end

Veya bir golfçü değilseniz (yakut 2.3 veya üstü gerekir):

if my_string&.size&.positive?
  # nonzero? also works
  p 'non-empty string'
else
  p 'nil or empty string'
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.