जाँच की जा रही है कि एक चर शून्य नहीं है और माणिक में शून्य नहीं है


271

मैं यह जाँचने के लिए निम्नलिखित कोड का उपयोग कर रहा हूँ कि क्या एक चर शून्य नहीं है और शून्य नहीं है

if(discount != nil && discount != 0) 
  ...
end

क्या ऐसा करने के लिए इससे अच्छा तरीका है?


1
संभवतः क्योंकि यह stackoverflow.com/questions/209495/… की एक सटीक प्रति है ।
डेविड नेहमे

1
discountअसत्य होने पर क्या करना चाहिए ?
एंड्रयू ग्रिम

1
मुझे लगता है discount.in? [0, nil]कि क्लीनर रास्ता संभव है
intmarinoreturn0

जवाबों:


428
जब तक छूट.निल? || छूट == ०
  # ...
समाप्त

31
के बजाय 'या' का उपयोग करें ||
ओरियन एडवर्ड्स

93
@ ओरियन-एडवर्ड्स क्यों?
NARKOZ

39
'या' का उपयोग करना खतरनाक है। 'या' में '=' ​​की तुलना में कम परिचालक की उपस्थिति है, इसलिए निम्नलिखित में अप्रत्याशित व्यवहार है: a = असत्य या सच्चा #a इस कथन के बाद गलत है
टॉम जी

20
@xiy वर्तमान में मार्गदर्शिका दिखावा करने की सलाह देती है और या नहीं है ((वह है और &&?)
user3125280

67
वर्तमान "रूबी स्टाइल गाइड" खड़ा है The and and or keywords are banned. It's just not worth it. Always use && and || instead.। और यह सही है, डेविड और टॉम कारणों के लिए।
आंद्रे फिग्यूएरेडो

40
class Object
  def nil_zero?
    self.nil? || self == 0
  end
end

# which lets you do
nil.nil_zero? # returns true
0.nil_zero?   # returns true
1.nil_zero?   # returns false
"a".nil_zero? # returns false

unless discount.nil_zero?
  # do stuff...
end

सामान्य अस्वीकरणों से सावधान रहें ... महान शक्ति / जिम्मेदारी, बंदर पैचिंग अंधेरे पक्ष आदि के लिए अग्रणी।


28

ठीक है, 5 साल बीत जाने के बाद ...।

if discount.try :nonzero?
  ...
end

यह ध्यान रखना महत्वपूर्ण है कि tryActiveSupport रत्न में परिभाषित किया गया है, इसलिए यह सादे माणिक्य में उपलब्ध नहीं है।


7
ध्यान दें कि यह एक रेल-विशिष्ट उत्तर है। वेनिला रूबी में एक tryविधि नहीं है ।
टॉम लॉर्ड

सही बात। हालाँकि यह ActiveSupport- विशिष्ट की तरह अधिक है, जो पूर्ण पटरियों की तुलना में बहुत हल्का और व्यापक रूप से उपयोग की जाने वाली निर्भरता है। वैसे भी अब @ ndn की प्रतिक्रिया सही है।
फिर से लिखा

सुरक्षित नेविगेशन का उपयोग करने के लिए संपादित
फिर से लिखना

1
इसका उत्तर अब stackoverflow.com/a/34819818/1954610 को डुप्लिकेट करता है ... मुझे लगता है tryकि वैकल्पिक विकल्प दिखाने के लिए इसे छोड़ने में मूल्य है (यही कारण है कि इसे पहली जगह में उखाड़ दिया गया था!), जब तक कि यह स्पष्ट नहीं है पाठक जो ActiveSupportवेनिला माणिक नहीं है।
टॉम लॉर्ड

प्वाइंट लिया गया, जवाब वापस मिला।
फिर से लिखा

27
जब तक [शून्य, 0] .include? (छूट) 
  # ...
समाप्त

13
सुंदर? हाँ। पठनीय? ज़रुरी नहीं।
एल निंजा ट्रेपडोर

1
मुझे यह पूरी तरह से पठनीय लगता है, और मैं इसे एक नए वर्ग पर पसंद करूंगा। बहुत बढ़िया।
कॉलिंक

दो स्थितियों को संभालने का सबसे रूबीवादी दृष्टिकोण।
युगेनद्रन

23

रूबी 2.3.0 आगे से, आप सुरक्षित नेविगेशन ऑपरेटर ( &.) के साथ संयोजन कर सकते हैं Numeric#nonzero?। यदि संख्या थी और - यदि संख्या थी तो &.रिटर्न :nilnilnonzero?0

if discount&.nonzero?
  # ...
end

या पोस्टफिक्स:

do_something if discount&.nonzero?

"foo"&.nonzero? # => NoMethodError: undefined method 'nonzero?' for "foo":String.... यह मनमाना वस्तुओं पर उपयोग करने के लिए सुरक्षित नहीं है।
टॉम भगवान

2
@TomLord, जैसा कि पिछली टिप्पणी में कहा गया है, इसका उद्देश्य मनमानी वस्तुओं के साथ काम करना नहीं था। इसके बजाय यह मामले से संबंधित है जब आपके पास कुछ है जो आपको पता है कि एक संख्या होनी चाहिए, लेकिन यह भी हो सकती है nil
ndnenkov

मैं इस तथ्य को उत्तर में स्पष्ट कर दूंगा, बजाय इसके कि कोई इसे पढ़े और टिप्पणियों में अस्वीकरण को उजागर न करे।
टॉम भगवान

@TomLord, यह उत्तर में कहा गया है - " nonzero?यदि संख्या थी 0" । यह भी जांचने की आवश्यकता है कि क्या पूरी तरह से मनमानी वस्तु 0उत्पन्न होती है, इसकी तुलना में शायद ही कभी किसी संख्या की जांच हो या न हो nil। इसलिए यह लगभग निहित है। यहां तक ​​कि अगर कोई किसी तरह से विपरीत धारणा बनाता है, तो वे तुरंत समझ जाएंगे कि क्या हो रहा है जब वे इसे निष्पादित करने का प्रयास करते हैं।
ndnenkov


15

आप ऐसा कर सकते हैं:

if (!discount.nil? && !discount.zero?)

यहां आदेश महत्वपूर्ण है, क्योंकि यदि discountहै nil, तो इसकी एक zero?विधि नहीं होगी । रूबी के शॉर्ट-सर्किट मूल्यांकन को इसे मूल्यांकन करने की कोशिश से रोकना चाहिए discount.zero?, हालांकि, यदि discountहै nil


11

आप अपनी खाली पंक्ति को पूर्णांक मान में बदल सकते हैं और शून्य की जांच कर सकते हैं।

"".to_i.zero? => true
nil.to_i.zero? => true

सावधान: 0.1.to_i == 0
साइमन बी।

3
if discount and discount != 0
  ..
end

अद्यतन, यह होगा के falseलिएdiscount = false


2

आप NilClassप्रदान की गई #to_iविधि का लाभ उठा सकते हैं , जो nilमानों के लिए शून्य लौटाएगा :

unless discount.to_i.zero?
  # Code here
end

यदि discountभिन्नात्मक संख्याएँ हो सकती हैं, तो आप #to_fइसके स्थान पर उपयोग कर सकते हैं , ताकि संख्या को गोल से शून्य होने से रोका जा सके।


क्या यह @ oivoodo के उत्तर के समान नहीं है?
कैरी स्वेवेलैंड

मनमानी वस्तुओं के लिए काम नहीं करता है"".to_i == "foo".to_i == "0".to_i == 0। आपका तरीका सभी प्रकार के अनजाने प्रकार के ज़बरदस्ती बना देगा। NoMethodErrorअगर discountयह जवाब नहीं देता है तो यह भी विफल हो जाएगा to_i
टॉम भगवान

2
def is_nil_and_zero(data)
     data.blank? || data == 0 
end  

यदि हम पास करते हैं तो "" यह खाली हो जाएगा, जबकि खाली है? सच लौटाता है। डेटा = गलत रिक्त होने पर समान स्थिति होती है? शून्य, झूठे, खाली या व्हाट्सएप स्ट्रिंग के लिए सही है। तो खाली उपयोग करना बेहतर है? खाली स्ट्रिंग से बचने का तरीका भी।


1
blank?एक रेल-विशिष्ट विधि है, और वेनिला रूबी में उपलब्ध नहीं है।
टॉम भगवान

तुम सही हो!! मुझे लगा कि यह "रोर" टैग से संबंधित है इसलिए यहां पोस्ट किया गया है। मेरी गलती। यह वेनिला रूबी में काम नहीं करने वाला है।
सरोज

1

डेटाबेस रिकॉर्ड के साथ काम करते समय , मैं माइग्रेशन सहायक का उपयोग करके, सभी खाली मानों को प्रारंभ करना पसंद करता हूं:

add_column :products, :price, :integer, default: 0

0

जब तक आपके कोड को प्रारंभ करने की कोशिश न करने और उसका उपयोग न करने की गारंटी दी जाती है, तब तक आप छूट को 0 से प्रारंभ कर सकते हैं। मुझे लगता है कि एक चेक को हटा देगा, मैं कुछ और नहीं सोच सकता।



0

मैं एक अधिक क्लीनर दृष्टिकोण का उपयोग करना पसंद करता हूं:

val.to_i.zero?

val.to_iएक वापस आ जाएगी 0अगर वैल एक है nil,

उसके बाद, हमें केवल इतना करना है कि अंतिम मूल्य शून्य है या नहीं


-1

वैकल्पिक समाधान शोधन का उपयोग करना है, जैसे:

module Nothingness
  refine Numeric do
    alias_method :nothing?, :zero?
  end

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

using Nothingness

if discount.nothing?
  # do something
end

-7

मेरा मानना ​​है कि रूबी कोड के लिए निम्नलिखित पर्याप्त है। मुझे नहीं लगता कि मैं एक इकाई परीक्षण लिख सकता था जो इस और मूल के बीच कोई अंतर दिखाता है।

if discount != 0
end

8
यह मूल्यांकन करेगा trueकि क्या छूट थी nil
एंड्रयू ग्रिम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.