มีวิธีที่ดีกว่าในการตรวจสอบศูนย์หรือความยาว == 0 ของสตริงในทับทิมหรือไม่


169

มีวิธีที่ดีกว่าต่อไปนี้เพื่อตรวจสอบว่าสตริงเป็นศูนย์หรือมีความยาว 0 ในทับทิมหรือไม่?

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

ใน C # มีประโยชน์มากมาย

string.IsNullOrEmpty(myString)

มีอะไรคล้ายกับใน Ruby?


16
มันซ้ำซ้อนที่จะมีคำสั่ง if เช่นนี้: "if (condition) จากนั้นเป็นเท็จจริง ๆ " เงื่อนไขนั้นมีความจริงเช่นเดียวกับคำสั่ง if
KaptajnKold

my_string || my_string.length == 0จะเพิ่มNoMethodErrorถ้าmy_stringเป็นศูนย์ ฉันคิดว่าคุณหมายถึง:my_string.nil? || my_string.length == 0
Naveed

1
ควรจะเป็น!my_string || my_string.length == 0
levsa

คำตอบ:


224

เมื่อฉันไม่กังวลเกี่ยวกับการแสดงฉันมักจะใช้สิ่งนี้:

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

แน่นอนว่ามีหลากหลายรูปแบบ ...

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

2
รูปแบบการใช้stripอาจไม่มีประสิทธิภาพ
Marc-André Lafortune

10
อีกวิธีที่น่าสนใจคือ my_string.to_s.empty?
Ricardo Pessoa

สำหรับคนส่วนใหญ่ตัวเลือกแรกจะยอมรับได้อย่างสมบูรณ์และอ่านได้ดี
amrcus

68

หากคุณยินดีที่จะต้องการ ActiveSupport คุณสามารถใช้#blank?วิธีการที่กำหนดไว้สำหรับทั้ง NilClass และ String


15
โปรดทราบว่าสตริงที่มีช่องว่างเท่านั้นยังถือว่าว่างเปล่า ดังนั้น "" ว่างเปล่า เป็นความจริง.
Grant Hutchins

2
นอกจากนี้บูลีนเท็จ {} และ [] จะถือว่าว่างเปล่า เช่น {} .blank ?, [] .blank ?, false.blank? ทั้งหมดประเมินว่าเป็นจริง
ShaharZ

64

ฉันชอบทำสิ่งต่อไปนี้ (ในสภาพแวดล้อมที่ไม่ใช่ Rails / ActiveSupport):

variable.to_s.empty?

งานนี้เพราะ:

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

3
คำอธิบายที่ดีว่าทำไมstring.to_s.empty?ผลงานของทั้งสองและnil ""
georger

31

ทางเลือกอื่นสำหรับข้อเสนอของ jcoby คือ:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end

10
แต่ .. แต่ .. ห้องสมุดทับทิมหลักใช้สิ่งนี้แล้ว nil.to_s => "" ดังนั้นคุณจึงสามารถพูดสิ่งต่าง ๆ ได้สิ่งต่อไปนี้ == ""
DigitalRoss

1
@DigitalRoss วิธีนี้จะหลีกเลี่ยงการแปลงสตริงซึ่งอาจหรืออาจไม่ใช่ปัญหาด้านประสิทธิภาพเล็กน้อย
Vortico

30

ตามที่ได้กล่าวไว้ที่นี่ก่อนที่ Rails (ActiveSupport) จะมีช่องว่างที่มีประโยชน์หรือไม่? วิธีการและมีการใช้งานเช่นนี้:

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

ค่อนข้างง่ายต่อการเพิ่มเข้าไปในโครงการทับทิม

ความสวยงามของวิธีแก้ปัญหานี้คือมันทำงานได้โดยอัตโนมัติไม่เฉพาะกับ Strings เท่านั้น แต่ยังใช้กับอาเรย์และประเภทอื่น ๆ


15

variable.blank? จะทำมัน มันจะส่งกลับจริงถ้าสตริงว่างเปล่าหรือถ้าสตริงเป็นศูนย์


12
ที่จริงแล้วนี่เป็นเพียงส่วนขยายทางรถไฟเท่านั้นไม่ใช่ทับทิมบริสุทธิ์ แต่ถ้าคุณใช้รางมันมีประโยชน์มาก!
James P McGrath


7

ก่อนอื่นระวังเมธอดนั้น:

ดังที่Jesse Ezelพูดว่า:

แบรดเอบรัมส์

วิธีดังกล่าวอาจดูสะดวก แต่ส่วนใหญ่ฉันพบว่าสถานการณ์นี้เกิดขึ้นจากการพยายามปกปิดบั๊กที่ลึกกว่า

รหัสของคุณควรติดกับโปรโตคอลเฉพาะในการใช้สตริงและคุณควรเข้าใจการใช้โปรโตคอลในรหัสห้องสมุดและรหัสที่คุณใช้งาน

โดยทั่วไปแล้วโปรโตคอล NullOrEmpty เป็นการแก้ไขอย่างรวดเร็ว (ดังนั้นปัญหาจริงยังคงอยู่ที่อื่นและคุณมีสองโปรโตคอลที่ใช้งานอยู่) หรือไม่มีความเชี่ยวชาญในโปรโตคอลเฉพาะเมื่อใช้รหัสใหม่ (และอีกครั้งคุณควรรู้จริงๆว่าอะไร ค่าส่งคืนของคุณคือ) "

และถ้าคุณแก้ไขคลาส String ... ให้แน่ใจว่าNilClass ยังไม่ได้รับการแก้ไขเช่นกัน !

class NilClass
    def empty?; true; end
end

5

ทุกชั้นมี nil?วิธีการ:

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

และสตริงมี empty?วิธีการ:

if a_string.empty?
    # the string is empty
}

โปรดจำไว้ว่าสตริงนั้นไม่เท่ากันnilเมื่อมันว่างเปล่าดังนั้นให้ใช้empty?วิธีการตรวจสอบว่าสตริงนั้นว่างเปล่าหรือไม่


4

ตัวเลือกอื่นคือการแปลง nil ให้เป็นผลลัพธ์ที่ว่างเปล่าได้ทันที:

(my_string||'').empty?


2

Konrad Rudolph มีคำตอบที่ถูกต้อง

ถ้ามันเป็นปัญหากับคุณจริงๆให้ลิงแก้คลาส String หรือเพิ่มลงในคลาส / โมดูลที่คุณเลือก มันไม่ใช่วิธีปฏิบัติที่ดีในการติดตั้งวัตถุหลักของลิงเว้นแต่คุณจะมีเหตุผลที่น่าสนใจจริงๆ

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

จากนั้นคุณสามารถทำได้ String.nilorempty? mystring


2

ตรวจสอบสตริงที่ว่างเปล่าใน Ruby ธรรมดาขณะที่หลีกเลี่ยงข้อยกเว้น NameError

มีคำตอบที่ดีอยู่ที่นี่ แต่คุณไม่จำเป็นต้องใช้ ActiveSupport หรือ Monkey-patching เพื่อระบุกรณีการใช้งานทั่วไปที่นี่ ตัวอย่างเช่น:

my_string.to_s.empty? if defined? my_string

สิ่งนี้จะ "ทำสิ่งที่ถูกต้อง" หากmy_stringเป็นศูนย์หรือสตริงว่าง แต่จะไม่เพิ่มข้อยกเว้นNameErrorหากไม่ได้กำหนดmy_string โดยทั่วไปแล้วสิ่งนี้จะเป็นสิ่งที่เหมาะสมกว่า

my_string.to_s.empty? rescue NameError

หรือละเอียดมากขึ้นเพราะข้อยกเว้นควรได้รับการช่วยให้รอดในสิ่งที่คุณทำไม่ได้คาดหวัง ในกรณีนี้แม้ว่ามันจะเป็นข้อผิดพลาดทั่วไป แต่ตัวแปรที่ไม่ได้กำหนดนั้นไม่ได้เป็นกรณีพิเศษดังนั้นจึงควรจัดการตามนั้น

ไมล์สะสมของคุณอาจแตกต่างกันไป


1

คุณลองใช้การปรับแต่งแล้วหรือยัง

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

หากคุณใช้รางคุณสามารถใช้ #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)

ดังนั้นในทางกลับกันเพื่อตรวจสอบความยาวของศูนย์หรือศูนย์ !present?

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

0

#blank?ในรางที่คุณสามารถลอง

คำเตือน: มันจะให้ผลบวกเมื่อสตริงประกอบด้วยช่องว่าง:

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

แค่อยากจะชี้ให้เห็น อาจจะเหมาะกับความต้องการของคุณ

UPD เหตุใดฉันจึงได้รับคำถามเก่า ๆ ในฟีดของฉัน ขอโทษด้วยสำหรับการทำลายล้าง


0

สำหรับนักกอล์ฟรหัส:

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

หรือหากคุณไม่ใช่นักกอล์ฟ (ต้องใช้ทับทิม 2.3 หรือใหม่กว่า):

if my_string&.size&.positive?
  # nonzero? also works
  p 'non-empty string'
else
  p 'nil or empty string'
end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.