रूबी: अगर वेरिएबल बनाम अगर वेरिएबल.निल?


11

मैं रूबी के लिए नया हूं और मुझे आश्चर्य हुआ जब मुझे पता चला कि सभी वस्तुएं शून्य और असत्य से अलग हैं। यहां तक ​​कि 0 सच है।

भाषा की उस संपत्ति के बारे में एक अच्छी बात यह है कि आप लिख सकते हैं:

if !variable
  # do stuff when variable is nil
end

मेरे सहयोगी, जो अधिक अनुभवी रूबी डेवलपर्स हैं, मैं जोर देता हूं कि मुझे .nil का उपयोग करने के बजाय चुनना चाहिए? इस तरह:

if variable.nil?
  # do stuff when variable is nil
end

हालाँकि मेरा मानना ​​है कि उत्तरार्द्ध दो कारणों से एक बेहतर विकल्प है: 1. मुझे लगता है कि यह अधिक वस्तु उन्मुख है, विशेष रूप से रूबी जैसी भाषा में जहां सब कुछ एक वस्तु और संदेश का आदान-प्रदान है। 2. यह अधिक पठनीय है, मेरे विषय में, भले ही यह कम कॉम्पैक्ट हो।

क्या मैं यहाँ एक "नौसिखिया" गलती कर रहा हूँ?


4
क्या आप नील के लिए परीक्षण कर रहे हैं? या एक गलत मूल्य?

मैं नील के लिए परीक्षण कर रहा हूँ। मूल रूप से अगर चर शून्य है, तो मैं कुछ करता हूं (या नहीं)
जेवियर होलगुएरा

3
यदि आप शून्य के लिए परीक्षण कर रहे हैं, तो आप उस खंड में प्रवेश करने के लिए झूठी परीक्षा क्यों चाहते हैं?

सहमत हूँ, मैंने बताया कि पसंद करने के लिए एक और कारण के रूप में? लेकिन उन्होंने जोर देकर कहा कि "अगर वेरिएबल डू x" "if variable.nil? X" से ज्यादा मुहावरेदार है और जब आप जानते हैं कि वेरिएबल बूलियन नहीं है, तो
जेवियर होलगुएरा

जवाबों:


17

आपका क्या मतलब है लिखिए। मतलब आप जो लिखते हैं।

आओ हम एक अलग परीक्षा लेते हैं। .vowel?

if char == 'a'
   # do stuff
end

बनाम

if char.vowel?
   # do stuff
end

अब, यह स्पष्ट है कि ये एक ही काम नहीं करते हैं। लेकिन अगर आप केवल होने की उम्मीद कर charरहे हैं aया bयह काम करेगा। लेकिन यह अगले डेवलपर को भ्रमित करेगा - दूसरा ब्लॉक उन स्थितियों के लिए दर्ज किया जाएगा जहां चार [eiou]भी हैं। लेकिन इसके लिए a, यह सही ढंग से काम करेगा।

हां, यह मामला है कि nilऔर falseरूबी में केवल मिथ्या मूल्य हैं। हालांकि, अगर आप परीक्षण कर रहे हैं, तो के लिए nilके लिए परीक्षण से nil || false, यह क्या आप का मतलब यह नहीं है।

इसका मतलब है कि अगला डेवलपर (जो एक पागल कुल्हाड़ी हत्या है जो आपके घर का पता जानता है) कोड पढ़ेगा, और आश्चर्य होगा कि falseवहां भी क्यों जाना चाहिए।

उस कोड को लिखें जो आपको बताए कि आपका क्या मतलब है।


3

निम्नलिखित को धयान मे रखते हुए:

response = responses.to_a.first

यह पहले तत्व को लौटाएगा responses, या nil। फिर क्योंकि सशर्त बयान का इलाज nilके रूप में falseहम लिख सकते हैं:

response = responses.to_a.first
if response
  # do something ('happy path')
else
  # do something else
end

जो अधिक पठनीय है:

if response.nil?
  # do something else
else
  # do something ('happy path')
end

if (object)पैटर्न रूबी कोड में बहुत आम है। यह भी अच्छी तरह से refactoring की ओर जाता है, जैसे:

if response = responses.to_a.first
  do_something_with(response)
else
  # response is equal to nil
end

यह भी याद रखें कि एक रूबी विधि nilडिफ़ॉल्ट रूप से वापस आती है। इसलिए:

def initial_response
  if @condition
    @responses.to_a.first
  else
    nil
  end
end

सरल किया जा सकता है:

def initial_response
  if @condition
    @responses.to_a.first
  end
end

तो हम आगे रिफ्लेक्टर कर सकते हैं:

if response = initial_response
  do_something_with(response)
else
  # response is equal to nil
end

अब आप यह तर्क दे सकते हैं कि लौटना nilहमेशा सबसे अच्छा विचार नहीं है, क्योंकि इसका मतलब है nilहर जगह की जाँच करना । लेकिन वह मछली का एक और केतली है। यह देखते हुए कि वस्तु "उपस्थिति या अनुपस्थिति" के लिए परीक्षण एक ऐसी लगातार आवश्यकता है, वस्तुओं की सत्यता रूबी का एक उपयोगी पहलू है, जो भाषा के लिए नए लोगों के लिए आश्चर्यजनक है।


2

न केवल if variable.nil?प्राकृतिक भाषा की तरह अधिक पढ़ा जाता है , यह एक प्रोग्रामर के खिलाफ भी गलती से एक falseमूल्य प्रदान करता है और आपके ifबयान में गिर जाता है , क्योंकि रूबी एक शिथिल टाइप भाषा है।


1
तो मूल प्रश्न में प्रारंभिक टिप्पणी गलत थी? "सामान करना चाहिए था जब चर शून्य या गलत है"? और चूंकि कोड टिप्पणी से मेल नहीं खाता है, यह एक बग है, सीधे बग है?
gnasher729

सही बात। एक सरल सत्यता परीक्षण तर्क त्रुटियों का परिचय दे सकता है।
ग्रेग बर्गार्ड्ट

0

मुहावरेदार, के unless variableलिए बेहतर है if !variable। नकारात्मक ifबयानों को अक्सर एक कोड गंध माना जाता है क्योंकि स्किमिंग करते समय नकार को याद करना आसान होता है।

यहाँ बड़ी तस्वीर यह है कि nilइस तरह से चेक करना भी एक कोड गंध का एक सा है। उचित OO के लिए, शून्य ऑब्जेक्ट पैटर्न का उपयोग करने का लक्ष्य रखें ताकि इस प्रकार की जांच की आवश्यकता न हो। http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/

वस्तुओं को बताएं कि क्या करना है, उनसे मत पूछो कि वे क्या हैं। यह कभी कभी बताओ मत पूछो के रूप में जाना जाता है

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