मैं रूबी में अनुभवी नहीं हूं, इसलिए मेरा कोड "बदसूरत" लगता है और मुहावरेदार नहीं:
def logged_in?
!user.nil?
end
मुझे कुछ पसंद है
def logged_in?
user.not_nil?
end
लेकिन ऐसी विधि नहीं खोज सकते जो विरोध करे nil?
जवाबों:
जब आप ActiveSupport का उपयोग कर रहे हों, तो वहाँ केवल गैर-शून्य के लिए जाँच करने के लिए user.present?
http://api.rubyonrails.org/classes/Object.html#method-i-face%3F है , क्यों नहीं उपयोग करें
def logged_in?
user # or !!user if you really want boolean's
end
false.present? == false
!false.nil? == true
आप बूलियन से अत्यधिक चिंतित लगते हैं।
def logged_in?
user
end
यदि उपयोगकर्ता शून्य है, तो log_in? एक "गलत" मान लौटाएगा। अन्यथा, यह एक वस्तु लौटाएगा। रूबी में हमें सच या झूठ की वापसी की आवश्यकता नहीं है, क्योंकि हमारे पास जावास्क्रिप्ट में "सच्चाई" और "गलत" मान हैं।
अपडेट करें
यदि आप रेल का उपयोग कर रहे हैं, तो आप present?
विधि का उपयोग करके इसे अधिक अच्छी तरह से पढ़ सकते हैं :
def logged_in?
user.present?
end
?
यह है कि यह एक बूलियन लौटाता है। !!value
एक बूलियन के लिए कुछ भी परिवर्तित करने का क्लासिक तरीका है। बिल्कुल वैसा ही नहीं, लेकिन इस मामले Object#present?
में आरओआर भी अच्छा है।
present?
अपने प्रश्न के उत्तर के रूप में प्रस्तुत अन्य उत्तरों से सावधान रहें ।
present?
blank?
रेल के विपरीत है ।
present?
जाँच करता है कि क्या सार्थक मूल्य है। ये चीजें एक present?
चेक को विफल कर सकती हैं :
"".present? # false
" ".present? # false
[].present? # false
false.present? # false
YourActiveRecordModel.where("false = true").present? # false
जबकि एक !nil?
चेक देता है:
!"".nil? # true
!" ".nil? # true
![].nil? # true
!false.nil? # true
!YourActiveRecordModel.where("false = true").nil? # true
nil?
जाँचता है कि क्या वास्तव में कोई वस्तु है nil
। और कुछ: एक खाली स्ट्रिंग, 0
, false
, जो कुछ भी, नहीं है nil
।
present?
बहुत उपयोगी है, लेकिन निश्चित रूप से इसके विपरीत नहीं है nil?
। दोनों को भ्रमित करने से अप्रत्याशित त्रुटियां हो सकती हैं।
आपके उपयोग के मामले present?
में काम करेगा, लेकिन अंतर के बारे में पता होना हमेशा बुद्धिमान होता है।
false.blank?
के रूप में ही नहीं हैfalse.nil?
present?
आपके डेटाबेस को क्वेरी करेगा, nil?
इसके साथ सावधान नहीं होगा
शायद यह एक दृष्टिकोण हो सकता है:
class Object
def not_nil?
!nil?
end
end
!self.nil?
तब नहीं होना चाहिए !nil?
, या self
निहित है?
आप बस निम्नलिखित का उपयोग कर सकते हैं:
if object
p "object exists"
else
p "object does not exist"
end
यह न केवल नील बल्कि झूठे आदि के लिए भी काम करता है, इसलिए आपको यह देखने के लिए परीक्षण करना चाहिए कि क्या यह आपके usecase में काम करता है।
क्या मैं !
विधि से परिणाम पर रूबी-एस्क विधि की पेशकश कर सकता हूं nil?
।
def logged_in?
user.nil?.!
end
इतना गूढ़ कि रूबीमाइन आईडीई इसे एक त्रुटि के रूप में चिह्नित करेगा। ;-)
मैं एक वस्तु विधि की तलाश में इस सवाल पर पहुंचा, ताकि मैं ब्लॉक के बजाय Symbol#to_proc
शॉर्टहैंड का उपयोग कर सकूं ; मुझे arr.find(&:not_nil?)
इससे कहीं अधिक पठनीय लगता है arr.find { |e| !e.nil? }
।
मुझे जो विधि मिली है Object#itself
। मेरे उपयोग में, मैं कुंजी के लिए एक हैश में मान ढूंढना चाहता था name
, जहां कुछ मामलों में कुंजी को गलती से पूंजीकृत किया गया था Name
। वह वन-लाइनर इस प्रकार है:
# Extract values for several possible keys
# and find the first non-nil one
["Name", "name"].map { |k| my_hash[k] }.find(&:itself)
जैसा कि अन्य उत्तरों में उल्लेख किया गया है , यह उन मामलों में शानदार रूप से विफल होगा जहां आप एक बूलियन का परीक्षण कर रहे हैं।
my_hash.values_at("Name", "name").find
?
map
जिन्हें मैंने इस उदाहरण में सरलता के लिए हटा दिया था, इसलिए जैसा कि यहां लिखा गया है यह इसके साथ विनिमेय है values_at
। महत्वपूर्ण हिस्सा वह है जो पास हो जाता है find
।
present?
एक गैर-रिक्त स्ट्रिंग की आवश्यकता होती है।! "".nil?
सच्चा लौटाता है, लेकिन"".present?
झूठा देता है।