"शून्य या शून्य" के लिए सर्वश्रेष्ठ रूबी मुहावरे


83

मैं यह देखने के लिए एक संक्षिप्त तरीके की तलाश कर रहा हूं कि क्या यह शून्य या शून्य है या नहीं। वर्तमान में मैं कुछ ऐसा कर रहा हूं:

if (!val || val == 0)
  # Is nil or zero
end

लेकिन यह बहुत ही भद्दा लगता है।


1
यदि वैल बराबर है तो क्या होना चाहिए false?
एंड्रयू ग्रिम

जवाबों:


70

वस्तुओं में एक शून्य है? विधि

if val.nil? || val == 0
  [do something]
end

या, सिर्फ एक निर्देश के लिए:

[do something] if val.nil? || val == 0

5
"या" और "और", btw के उपयोग के लिए बाहर देखो, वे की तुलना में अलग और बहुत कम पूर्वता है तथा &&। कुछ टिप्पणियों के लिए blog.jayfields.com/2007/08/… देखें ।
माइक वुडहाउस

मैं प्रश्न में "गंध" के कुछ पोस्टर से सहमत हूं, हालांकि मेरे लिए यह अधिक माणिक तरीका है।
जोकेन

6
की पूर्वता orकिसी भी कोष्ठक यहाँ की आवश्यकता नहीं है, और एक अनुभवी Rubyist को स्वाभाविक रूप से पूरी तरह से पढ़ा जाएगा। केवल लोग हैं, जो कभी ने काट लिया जाता है ||बनाम orलोग हैं, जो पर्ल प्रोग्राम किया कभी नहीं किया है :) हैं
ephemient

1
केवल एक बार जब आप के बारे में चिंता करने की ज़रूरत है || बनाम या पूर्वता असाइनमेंट में है, बूलियन जाँच नहीं। हालाँकि, त्रुटि की जाँच के लिए शब्द की निम्न मिसाल बहुत काम आ सकती है।
रॉबर्ट के

3
मुझे लगता val && val == 0है कि बेहतर है।
Nakilon

35

यदि आपको वास्तव में अंत में प्रश्नवाचक चिन्ह वाले विधि नाम पसंद हैं:


if val.nil? || val.zero?
  # do stuff
end

आपका समाधान ठीक है, जैसा कि कुछ अन्य समाधान हैं।

यदि आप सावधान नहीं हैं, तो रूबी आपको सब कुछ करने के लिए एक शानदार तरीके से खोज कर सकती है।


32

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

unless val&.nonzero?
  # Is nil or zero
end

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

do_something unless val&.nonzero?

यह एक बहुत ही नया और आधुनिक जवाब था। इसके अलावा, इसका उपयोग करने के बारे में एक शानदार लेख यहां है: रूबी में सुरक्षित नेविगेशन ऑपरेटर (&।)
माइकल गास्किल

1
बहुत संक्षिप्त है, लेकिन टिप्पणी के बिना मुझे यह समझने में एक पल लगेगा कि unless val&.nonzero?"यदि शून्य शून्य या शून्य है" का अनुवाद
स्टीफन

1
@Stefan, सहमत। मैं खुद प्रोडक्शन कोड में इसका इस्तेमाल नहीं करूंगा। मैंने इसे पूर्णता के लिए शामिल किया। हालांकि इसके विपरीत पूरी तरह से पठनीय है - do_something if val&.nonzero?(उर्फ यदि शून्य valनहीं है nilऔर नहीं है)।
ndnenkov

29

सबसे पहले मुझे लगता है कि आप उस विशेष स्थिति के लिए जाँच कर सकते हैं सबसे संक्षिप्त तरीके के बारे में है।

दूसरा, मेरे लिए यह एक कोड गंध है जो आपके डिजाइन में संभावित दोष को इंगित करता है। आम तौर पर शून्य और शून्य का मतलब एक ही चीज़ नहीं होना चाहिए। यदि संभव हो तो आपको इस कोड को हिट करने से पहले वैल होने की संभावना को खत्म करने की कोशिश करनी चाहिए, या तो यह देखने के लिए कि विधि या किसी अन्य तंत्र की शुरुआत में।

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


4
कोड गंध के बारे में बहुत सही! +1 NullObject पैटर्न में देख सकते हैं। en.wikipedia.org/wiki/Null_Object_pattern
abyx

9

आप Object.nil का उपयोग कर सकते हैं? विशेष रूप से नील के लिए परीक्षण करने के लिए (और झूठे और नील के बीच नहीं फंसना)। आप एक विधि के रूप में अच्छी तरह से वस्तु में बंदर कर सकते हैं।

class Object
   def nil_or_zero?
     return (self.nil? or self == 0)
   end
end

my_object = MyClass.new
my_object.nil_or_zero?
==> false

यह अनुशंसित नहीं है क्योंकि सहकर्मियों के लिए ऑब्जेक्ट में परिवर्तन ट्रेस करना मुश्किल है, और आपके कोड को दूसरों के लिए अप्रत्याशित बना सकते हैं।


मैं ऑब्जेक्ट के बजाय न्यूमेरिक क्लास को संशोधित करूंगा।
एपोचॉल्फ

6
epochwolf, यदि आप इसे न्यूमेरिक क्लास पर रखते हैं, तो nil?हमेशा झूठे तरीके से लौटेंगे। nil?केवल NilClass पर सही है।
रयान मैक्ग्रेई

आप में विधि लागू कर सकते हैं Object, NilClassऔर NumericObjectलौटता था false, NilClassलौटता था trueऔर Numericलौटता था zero?
स्टीफन

6

nil.to_i शून्य देता है, इसलिए मैं अक्सर ऐसा करता हूं:

val.to_i.zero?

हालाँकि, आपको एक अपवाद मिलेगा यदि वैल एक ऐसी वस्तु है जो प्रतिक्रिया नहीं देती है।


संदर्भ के लिए: स्कॉट का जवाब और @AndrewGrimm ने इसके बारे में क्या कहा:"5".to_i == 5, but you're more or less right. Clever but doesn't actually work
पॉल वैन

4

मेरा मानना ​​है कि आपका कोड गलत है; : यह तीन मूल्यों के लिए तथ्य परीक्षा में होगा nil, falseऔर शून्य,। ऐसा इसलिए है क्योंकि !valअभिव्यक्ति उन सभी मूल्यों के लिए सही है जो झूठे हैं, जो रूबी में है nilऔर false

सबसे अच्छा मैं अभी आ सकता हूं

if val == nil || val == 0
  # do stuff
end

कौन सा पाठ्यक्रम बहुत चालाक नहीं है, लेकिन (बहुत) स्पष्ट है।


आप शायद मान सकते हैं कि प्रश्न में चर एक न्यूमेरिक है। यदि आपको यह भी पता नहीं है कि यह बूलियन है या न्यूमेरिक है तो कोड में बड़ी समस्याएं हैं।
माइक डेक

4

मेरा समाधान भी परिशोधन का उपयोग करता है, स्थिति को छोटा करता है।

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

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

using Nothingness

if val.nothing?
  # Do something
end

2

रेल यह विशेषता क्वेरी विधियों के माध्यम से करता है, जहां गलत और शून्य के अलावा, 0 और "" भी गलत का मूल्यांकन करता है।

if (model.attribute?) # => false if attribute is 0 and model is an ActiveRecord::Base derivation

हालाँकि, इसके पास अवरोधकों का अपना हिस्सा है। http://www.joegrossberg.com/archives/002995.html


लिंक काम नहीं करता है। मैं इस विधि के बारे में उत्सुक हूं #attribute, क्योंकि मुझे ऐसा कुछ नहीं मिला।
mrzasa

यह कुछ ऐसा है जो Rails / ActiveRecord फ्लाई पर जोड़ता है। यदि ग्राहक का कोई नाम फ़ील्ड, नाम है? यह जाँचने के लिए ऑटो जोड़ा गया है कि नाम खाली है या शून्य है। Api.rubyonrails.org/classes/ActiveRecord/Base.html देखें - अनुभाग 'विशेषता क्वेरी विधियों' के लिए खोजें
Gishu

2

संभव के रूप में मुहावरेदार होने के लिए, मैं यह सुझाव देता हूं।

if val.nil? or val == 0
    # Do something
end

चूंकि:

  • यह नील का उपयोग करता है? तरीका।
  • यह "या" ऑपरेटर का उपयोग करता है, जो बेहतर है ||
  • यह कोष्ठकों का उपयोग नहीं करता है, जो इस मामले में आवश्यक नहीं हैं। कोष्ठक का उपयोग केवल तब किया जाना चाहिए जब वे किसी उद्देश्य की पूर्ति करते हैं, जैसे कि कुछ ऑपरेटरों की पूर्वता को ओवरराइड करना।

1
हालांकि मुझे पता है कि यह सचमुच 7 साल पहले से है, मैंने इस वजह से नीचे उतारा
Devon Parsons

2

छोटा और स्पष्ट

[0, nil].include?(val)


2
उल्टा भी कर सकते हैं:val.in? [0,nil]
mahemoff

1
@ ओमहॉफ जो निश्चित रूप से इसके लिए सबसे अच्छा मुहावरा है!
intmarinoreturn0

@ ओमहॉफ के बेहतर उपयोग में शामिल हैं ?, क्योंकि इसकी तुलना में तेज है? रेफरी: stackoverflow.com/questions/28272550/…
लखानी अलीराज

अच्छी बात है, लेकिन मैंने इसे अभी आधुनिक रूबी और इन पर चलाया? वास्तव में एक एकल आह्वान के लिए तेज था, और 1000 आह्वान के लिए, वे काफी समान हैं। दोनों वैसे भी धधक रहे हैं, काफी है कि कुछ अनुप्रयोगों imo प्रभावित होगा। gist.github.com/mahemoff/7232648e1ccb9d23e0f4670913400bd8
mahemoff

2

सबसे छोटा और सबसे अच्छा तरीका होना चाहिए

if val&.>(0)
  # do something
end

इसके लिए val&.>(0) जब शून्य शून्य होता है तब से शून्य वापस आ जाता है> मूल रूप से एक विधि भी है, माणिक में झूठे के बराबर शून्य। यह झूठे जब लौटते हैं val == 0


3
क्या सबसे कम तरीका है?
सेबस्टियन पाल्मा

0

मैं एक "है?" को परिभाषित करके इससे निपटता हूं विधि, जिसे मैं बाद में विभिन्न वर्गों पर अलग-अलग लागू कर सकता हूं। तो ऐरे के लिए, "है?" का अर्थ है "आकार> 0"; फिक्सनम के लिए इसका अर्थ है "स्व! = 0"; स्ट्रिंग के लिए इसका अर्थ है "स्व! = ''"। निलक्लास, निश्चित रूप से, परिभाषित करता है "है?" बस के रूप में शून्य लौट रहा है।


0

आप चाहें caseतो इस्तेमाल कर सकते हैं :

 case val with nil, 0
      # do stuff
 end

फिर आप कुछ भी काम कर सकते हैं ===, जो कभी-कभी अच्छा होता है। या ऐसा कुछ करें:

not_valid = nil, 0
case val1 with *not_valid
      # do stuff
 end
 #do other stuff
 case val2 with *not_valid, false    #Test for values that is nil, 0 or false
      # do other other stuff
 end

यह बिल्कुल अच्छा OOP नहीं है, लेकिन यह बहुत लचीला है और यह काम करता है। मेरा ifआमतौर पर caseवैसे भी खत्म होता है।

निश्चित रूप से Enum.any?/ Enum.include?तरह के काम भी ... यदि आप वास्तव में गुप्त रखना चाहते हैं:

if [0, nil].include? val
    #do stuff
end

एक विधि या कार्य को परिभाषित करने के लिए सही काम करना निश्चित रूप से है। या, यदि आपको कई मूल्यों के साथ एक ही काम करना है, तो उन अच्छे पुनरावृत्तियों के संयोजन का उपयोग करें।


0

मैं वास्तव में रेल की तरह blank?बातें उस तरह के लिए विधि है, लेकिन यह नहीं लौटेगा trueके लिए 0। तो आप अपना तरीका जोड़ सकते हैं:

def nil_zero? 
  if respond_to?(:zero?) 
    zero? 
  else 
    !self 
  end 
end 

और यह जांच करेगा कि क्या कुछ मूल्य शून्य है या 0:

nil.nil_zero?
=> true
0.nil_zero?
=> true
10.nil_zero?
=> false

if val.nil_zero?
  #...
end

0

बंदर को एक कक्षा में रखने के बजाय, आप रूबी 2.1 में शुरू होने वाले शोधन का उपयोग कर सकते हैं । शोधन बंदर पैचिंग के समान है; उस में, वे आपको कक्षा को संशोधित करने की अनुमति देते हैं, लेकिन संशोधन उस दायरे तक सीमित है जिसे आप इसमें उपयोग करना चाहते हैं।

यदि आप एक बार इस जाँच को करना चाहते हैं तो यह ओवरकिल है, लेकिन यदि आप अपने आप को दोहरा रहे हैं तो यह बन्दर पैचिंग का एक बढ़िया विकल्प है।

module NilOrZero
  refine Object do
    def nil_or_zero?
      nil? or zero?
    end
  end
end

using NilOrZero
class Car
  def initialize(speed: 100)
    puts speed.nil_or_zero?
  end
end

car = Car.new              # false
car = Car.new(speed: nil)  # true
car = Car.new(speed: 0)    # true

अंतिम मिनट में फ़ाइल में स्कूप करने के लिए परिशोधन को बदल दिया गया था। तो पहले के उदाहरणों ने यह दिखाया होगा, जो काम नहीं करेगा।

class Car
  using NilOrZero
end

0

यह बहुत संक्षिप्त है:

if (val || 0) == 0
  # Is nil, false, or zero.
end

यह तब तक काम करता है जब तक आप falseउसी के साथ व्यवहार नहीं करते nil। मैंने जिन परियोजनाओं में काम किया है, उनमें यह अंतर केवल एक बार में ही मायने रखता है। बाकी समय मैं व्यक्तिगत रूप से स्किप करना पसंद करता हूं .nil?और थोड़ा कम कोड रखता हूं ।

[ अद्यतन : मैं इस तरह की बात किसी भी अधिक नहीं लिखता हूं। यह काम करता है लेकिन बहुत गूढ़ है। मैंने कुछ जगहों पर जहां मैंने यह किया है, बदलकर अपने कुकर्मों को सही करने की कोशिश की है।]

वैसे, मैंने इसका उपयोग नहीं किया .zero?क्योंकि यह एक अपवाद को बढ़ाता valहै, अगर कहते हैं, एक स्ट्रिंग। लेकिन .zero?ठीक होगा यदि आप जानते हैं कि ऐसा नहीं है।


[edited]मैंने सोचा था कि अगर valशून्य था तो यह अभिव्यक्ति nil == 0(और इस तरह वापसी false) का मूल्यांकन करेगी । हालाँकि ऐसा लगता है कि यह वास्तव में काम करता है, हालाँकि मुझे नहीं लगता कि यह बहुत पठनीय है।
ओमनिकॉन

मेरा मानना ​​है कि यहाँ मेरा दृष्टिकोण बहुत गूढ़ था, बस कुछ पात्रों को बचाने के लिए, और मैं इसे इस तरह नहीं लिखूंगा। इसलिए मैं किसी भी
उथल

0

यह शून्य और शून्य के लिए सही का मूल्यांकन करता है: nil.to_s.to_d == 0



-1

एक और समाधान:

if val.to_i == 0
  # do stuff
end

1
यह केवल तभी काम करता है यदि वैल या तो पूर्णांक या शून्य है; 0.5.to_i == 0, any_string.to_i == 0, आदि
Zach Langley

"5".to_i == 5, लेकिन आप कमोबेश सही हैं। चतुर लेकिन वास्तव में काम नहीं करता है।
एंड्रयू ग्रिम

-3
val ||= 0
if val == 0
# do something here
end

3
-1: क्या होगा यदि valआवश्यकताओं को रखा जाए? आप इस विधि से इनपुट डेटा को क्लोब कर रहे हैं, और शून्य या शून्य की जांच करने के लिए बेहतर, कम विनाशकारी तरीके हैं।
प्लेटिनम अज़ुरे

3
कैसे के बारे में अगर (घाटी || 0)।
टिमके
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.