क्या रूबी में एक स्ट्रिंग की जाँच करने का एक बेहतर तरीका या लंबाई == 0 है?


169

क्या एक स्ट्रिंग शून्य है या रूबी में 0 की लंबाई है, यह देखने के लिए निम्नलिखित की तुलना में बेहतर तरीका है?

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

C # में वहाँ काम है

string.IsNullOrEmpty(myString)

रूबी में ऐसा ही कुछ?


16
यदि इस तरह का बयान दिया जाना बेमानी है: "अगर (शर्त) तो सच है और गलत"। दशा में इफ-स्टेटमेंट जैसी ही सत्यता है।
कप्तजनकोल्ड 13

my_string || my_string.length == 0NoMethodErrorअगर my_stringएक शून्य है तो उठाएंगे । मुझे लगता है कि आपका मतलब है:my_string.nil? || my_string.length == 0
नवेद

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करना काफी अक्षम हो सकता है।
मार्क-एंड्रे लाफ्यून

10
एक और दिलचस्प तरीका है my_string.to_s.empty?
रिकार्डो पेसोआ नोवा

ज्यादातर लोगों के लिए पहला विकल्प पूरी तरह से स्वीकार्य होगा, और अच्छी तरह से पढ़ता है।
एमकस

68

यदि आप ActiveSupport की आवश्यकता के लिए तैयार हैं, तो आप बस उस #blank?विधि का उपयोग कर सकते हैं , जिसे NilClass और String दोनों के लिए परिभाषित किया गया है।


15
ध्यान दें कि केवल व्हाट्सएप युक्त एक स्ट्रिंग को अभी भी रिक्त माना जाता है। तो "" .ब्लैंक? सच हैं।
हचिन्स ग्रांट

2
इसके अलावा, बूलियन झूठा, {}, और [] रिक्त माना जाता है। Ie {} .blank ?, [] .blank ?, false.blank? सभी सत्य का मूल्यांकन करते हैं।
शहजादे

64

मैं इसे इस प्रकार करना चाहता हूं (एक गैर रेल / सक्रिय वातावरण में):

variable.to_s.empty?

यह काम करता है क्योंकि:

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

3
एक अच्छी व्याख्या क्यों और string.to_s.empty?दोनों के लिए काम करती है । nil""
जार्जर

31

जेकोबी के प्रस्ताव का एक विकल्प होगा:

class NilClass
  def nil_or_empty?
    true
  end
end

class String
  def nil_or_empty?
    empty?
  end
end

10
लेकिन .. लेकिन .. रूबी कोर लाइब्रेरी पहले से ही इसे लागू करता है। nil.to_s => "", इसलिए आप बात कह सकते हैं ।to_s == ""
DigitalRoss

1
@DigitalRoss यह स्ट्रिंग रूपांतरण से बचता है जो एक मामूली प्रदर्शन मुद्दा हो सकता है या नहीं हो सकता है।
वोर्टिको

30

जैसा कि यह कहा गया था कि रेल्स (ActiveSupport) से पहले एक खाली जगह है? विधि और इसे इस तरह लागू किया जाता है:

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

किसी भी रूबी-आधारित परियोजना में जोड़ना बहुत आसान है।

इस समाधान की सुंदरता यह है कि यह न केवल स्ट्रिंग्स के लिए बल्कि एर्रेज़ और अन्य प्रकारों के लिए भी ऑटो-जादुई काम करता है।


15

variable.blank? करूंगा। यदि स्ट्रिंग खाली है या यदि स्ट्रिंग शून्य है, तो यह सही है।


12
दरअसल, यह एक रेल केवल विस्तार है, शुद्ध रूबी नहीं। लेकिन अगर आप रेल का उपयोग कर रहे हैं तो यह बहुत आसान है!
जेम्स पी मैक्ग्राथ

13

nil?बूलियन संदर्भों में छोड़ा जा सकता है। आम तौर पर, आप इसका उपयोग C # कोड को दोहराने के लिए कर सकते हैं:

return my_string.nil? || my_string.empty?

7

सबसे पहले, उस विधि से सावधान रहें:

के रूप में जेसी Ezel का कहना है:

ब्रैड अब्राम

"विधि सुविधाजनक लग सकती है, लेकिन ज्यादातर बार मैंने पाया है कि यह स्थिति गहरी बग को ढंकने की कोशिश से उत्पन्न होती है।

आपका कोड स्ट्रिंग्स के उपयोग पर एक विशेष प्रोटोकॉल से जुड़ा होना चाहिए, और आपको लाइब्रेरी कोड में और जिस कोड के साथ आप काम कर रहे हैं, उस प्रोटोकॉल का उपयोग समझना चाहिए।

NullOrEmpty प्रोटोकॉल आम तौर पर एक त्वरित फिक्स है (इसलिए वास्तविक समस्या अभी भी कहीं और है, और आपको दो प्रोटोकॉल का उपयोग मिला है) या नए कोड को लागू करते समय किसी विशेष प्रोटोकॉल में विशेषज्ञता की कमी है (और फिर, आपको वास्तव में पता होना चाहिए कि क्या है आपके रिटर्न मान) हैं। "

और अगर आप स्ट्रिंग क्लास को पैच करते हैं ... तो सुनिश्चित करें कि 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

एक अन्य विकल्प नील को मक्खी पर खाली परिणाम में बदलना है:

(my_string||'').empty?


2

कोनराड रुडोल्फ का सही उत्तर है।

यदि यह वास्तव में आपको परेशान करता है, तो बंदर स्ट्रिंग क्लास को पैच करता है या इसे आपकी पसंद के वर्ग / मॉड्यूल में जोड़ता है। यह वास्तव में बंदर पैच कोर ऑब्जेक्ट्स के लिए एक अच्छा अभ्यास नहीं है जब तक कि आपके पास वास्तव में सम्मोहक कारण नहीं है।

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

तब आप कर सकते हैं String.nilorempty? mystring


2

प्लेन रूबी में खाली स्ट्रिंग्स की जांच करें, जबकि NameError अपवाद से बचें

यहाँ कुछ अच्छे उत्तर हैं, लेकिन आपको यहां सामान्य उपयोग के मामले को संबोधित करने के लिए ActiveSupport या मंकी-पैचिंग की आवश्यकता नहीं है। उदाहरण के लिए:

my_string.to_s.empty? if defined? my_string

यह "सही काम करेगा" अगर my_string शून्य या एक रिक्त स्ट्रिंग है, लेकिन एक NameError अपवाद नहीं बढ़ाएगा यदि my_string परिभाषित नहीं है। यह आमतौर पर अधिक वंचित करने के लिए बेहतर है:

my_string.to_s.empty? rescue NameError

या इसकी अधिक क्रिया ilk, क्योंकि अपवाद वास्तव में उन चीजों के लिए सहेजे जाने चाहिए जिन्हें आप होने की उम्मीद नहीं करते हैं। इस मामले में, जबकि यह एक सामान्य त्रुटि हो सकती है, एक अपरिभाषित चर वास्तव में एक असाधारण परिस्थिति नहीं है, इसलिए इसे तदनुसार नियंत्रित किया जाना चाहिए।

आपकी माइलेज भिन्न हो सकती है।


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

बस इसे इंगित करना चाहता था। शायद यह आपकी आवश्यकताओं के अनुरूप हो

युपीडी। मुझे अपने फ़ीड में पुराने प्रश्न क्यों मिल रहे हैं? नेक्रोपोस्टिंग के लिए क्षमा करें।


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.