Apakah Ada Cara yang Lebih Baik untuk Memeriksa Nihil atau Panjang == 0 dari String di Ruby?

169

Apakah ada cara yang lebih baik daripada yang berikut untuk memeriksa untuk melihat apakah sebuah string nil ATAU memiliki panjang 0 di Ruby?

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

Di C # ada yang berguna

string.IsNullOrEmpty(myString)

Adakah yang mirip dengan itu di Ruby?

Jim Fiorato
sumber
16
Itu berlebihan untuk memiliki pernyataan if seperti ini: "jika (kondisi) maka true else false". Kondisi itu sendiri memiliki kebenaran yang sama dengan pernyataan if.
KaptajnKold
my_string || my_string.length == 0akan menaikkan NoMethodErrorjika my_stringnihil. Saya pikir Anda maksud:my_string.nil? || my_string.length == 0
Naveed
1
Haruskah!my_string || my_string.length == 0
levsa

Jawaban:

224

Ketika saya tidak khawatir tentang kinerja, saya akan sering menggunakan ini:

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

Ada berbagai variasi, tentu saja ...

if my_string.to_s.strip.length == 0
  # It's nil, empty, or just whitespace
end
Ezran
sumber
2
Variasi menggunakan stripbisa sangat tidak efisien.
Marc-André Lafortune
10
cara lain yang menarik adalah my_string.to_s.empty?
Ricardo Pessoa
Bagi kebanyakan orang opsi pertama akan sepenuhnya dapat diterima, dan dibaca dengan baik.
amrcus
68

Jika Anda ingin meminta ActiveSupport, Anda bisa menggunakan #blank?metode yang ditentukan untuk NilClass dan String.

Avdi
sumber
15
Perhatikan bahwa String yang hanya berisi spasi putih masih dianggap kosong. Jadi "" kosong? adalah benar.
Grant Hutchins
2
Juga, boolean false, {}, dan [] dianggap kosong. Yaitu {} .blank ?, [] .blank ?, false.blank? semua mengevaluasi benar.
ShaharZ
64

Saya suka melakukan ini sebagai berikut (dalam lingkungan non Rails / ActiveSupport):

variable.to_s.empty?

ini bekerja karena:

nil.to_s == ""
"".to_s == ""
Vinay Sahni
sumber
3
Penjelasan yang bagus mengapa string.to_s.empty?bekerja untuk keduanya nildan "".
georger
31

Alternatif untuk proposal jcoby adalah:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end
Rômulo Ceccon
sumber
10
Tapi .. tapi .. Perpustakaan inti ruby ​​sudah mengimplementasikan ini. nil.to_s => "", jadi Anda bisa mengatakan thing.to_s == ""
DigitalRoss
1
@DigitalRoss Ini menghindari konversi string yang mungkin atau mungkin tidak sedikit masalah kinerja.
Vortico
30

Seperti yang dikatakan di sini sebelum Rails (ActiveSupport) ada yang kosong berguna ? metode dan diimplementasikan seperti ini:

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

Cukup mudah untuk ditambahkan ke proyek berbasis ruby.

Keindahan dari solusi ini adalah ia bekerja secara ajaib-otomatis tidak hanya untuk Strings tetapi juga untuk Array dan tipe lainnya.

Honza
sumber
15

variable.blank? akan melakukannya. Ini mengembalikan true jika string kosong atau jika string kosong.

Satya Kalluri
sumber
12
Sebenarnya, ini hanya perpanjangan rel, bukan ruby ​​murni. Tetapi jika Anda menggunakan rel itu sangat berguna!
James P McGrath
13

nil?dapat dihilangkan dalam konteks boolean. Secara umum, Anda dapat menggunakan ini untuk mereplikasi kode C #:

return my_string.nil? || my_string.empty?
Konrad Rudolph
sumber
7

Pertama-tama, waspadalah terhadap metode itu:

Seperti yang dikatakan Jesse Ezel :

Brad Abrams

"Metode ini mungkin terlihat nyaman, tetapi sebagian besar waktu saya telah menemukan bahwa situasi ini muncul dari upaya untuk menutupi bug yang lebih dalam.

Kode Anda harus tetap berpegang pada protokol tertentu tentang penggunaan string, dan Anda harus memahami penggunaan protokol dalam kode pustaka dan dalam kode yang Anda gunakan.

Protokol NullOrEmpty biasanya merupakan perbaikan cepat (jadi masalah sebenarnya masih di tempat lain, dan Anda punya dua protokol yang digunakan) atau kurangnya keahlian dalam protokol tertentu saat menerapkan kode baru (dan sekali lagi, Anda harus benar-benar tahu apa nilai pengembalian Anda adalah). "

Dan jika Anda menambal kelas String ... pastikan NilClass juga belum ditambal !

class NilClass
    def empty?; true; end
end
VONC
sumber
5

Setiap kelas memiliki nil?metode:

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

Dan string memiliki empty?metode:

if a_string.empty?
    # the string is empty
}

Ingatlah bahwa string tidak sama nilketika kosong, jadi gunakan empty?metode ini untuk memeriksa apakah string kosong.

Jeremy Ruten
sumber
4

Pilihan lain adalah mengonversi nol ke hasil kosong dengan cepat:

(my_string||'').empty?

mahemoff
sumber
2

Konrad Rudolph memiliki jawaban yang tepat.

Jika itu benar-benar mengganggu Anda, monyet tambal kelas String atau menambahkannya ke kelas / modul pilihan Anda. Ini benar-benar bukan praktik yang baik untuk menambal objek inti kecuali Anda memiliki alasan yang sangat menarik.

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

Maka Anda bisa melakukannya String.nilorempty? mystring

jcoby
sumber
2

Periksa string kosong di Ruby polos sambil menghindari pengecualian NameError

Ada beberapa jawaban yang baik di sini, tetapi Anda tidak perlu ActiveSupport atau monyet-patching untuk mengatasi kasus penggunaan umum di sini. Sebagai contoh:

my_string.to_s.empty? if defined? my_string

Ini akan "melakukan hal yang benar" jika my_string nil atau string kosong, tetapi tidak akan memunculkan exception NameError jika my_string tidak didefinisikan. Ini umumnya lebih disukai daripada yang lebih dibuat-buat:

my_string.to_s.empty? rescue NameError

atau yang lebih verbose sejenisnya, karena pengecualian harus benar-benar disimpan untuk hal-hal yang tidak Anda harapkan terjadi. Dalam hal ini, walaupun mungkin merupakan kesalahan umum, variabel yang tidak terdefinisi tidak benar-benar keadaan yang luar biasa, sehingga harus ditangani sesuai.

Jarak tempuh Anda mungkin beragam.

Todd A. Jacobs
sumber
1

Sudahkah Anda mencoba Perbaikan?

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?
RichOrElse
sumber
1

Jika Anda menggunakan rel, Anda bisa menggunakan #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)

Jadi, sebaliknya periksa untuk penggunaan nol atau panjang nol !present?

!(nil.present?)  # ==> true
!(''.present?)    # ==> true
!('  '.present?)  # ==> true
!([].present?)    # ==> true
!(false.present?) # ==> true
Dhivya Dandapani
sumber
0

Di rel Anda bisa mencoba #blank?.

Peringatan: itu akan memberi Anda positif ketika string terdiri dari spasi:

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

Hanya ingin menunjukkannya. Mungkin itu sesuai dengan kebutuhan Anda

UPD. mengapa saya mendapatkan pertanyaan lama di feed saya? Maaf untuk necroposting.

Tidak ada
sumber
0

Untuk pegolf kode:

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

Atau jika Anda bukan seorang pegolf (membutuhkan ruby ​​2.3 atau yang lebih baru):

if my_string&.size&.positive?
  # nonzero? also works
  p 'non-empty string'
else
  p 'nil or empty string'
end
snipsnipsnip
sumber