2012-10-03 14 views
11

nil || false रिटर्न false और false || nil रिटर्न nil देता है। क्या किसी के पास इसके लिए स्पष्टीकरण है?शून्य || झूठी और झूठी || रूबी

+0

बोनस अंक के लिए क्यों 'शून्य || झूठी और झूठी || nil' झूठे – pguardiario

+0

@pguardiario http://stackoverflow.com/questions/1840488/operator-precedence-for-and-in-ruby – x1a4

उत्तर

16

रूबी में, सबकुछ एक अभिव्यक्ति है, और एक अभिव्यक्ति इसके भीतर मूल्यांकन किए गए अंतिम मूल्य को वापस कर देगी।

आपके दोनों उदाहरणों के लिए, || अभिव्यक्ति के बाईं ओर एक झूठी मान का मूल्यांकन करता है, इसलिए रुबी फिर दायीं तरफ मूल्यांकन करता है, और इसे वापस करता है।

+0

का मूल्यांकन आपका स्पष्टीकरण वास्तव में स्पष्ट है, धन्यवाद! – user1538814

3

|| मूल्यांकन की गई अंतिम अभिव्यक्ति का परिणाम देता है। यदि यह एलएचएस का मूल्यांकन करता है और true मान पाता है, तो आपको एलएचएस मिल जाता है; अन्यथा, आपको आरएचएस मिल जाता है (कोई फर्क नहीं पड़ता कि आरएचएस क्या हो सकता है)।

+0

यह वास्तव में एक अच्छा स्पष्टीकरण था, धन्यवाद! – user1538814

4

जैसा कि अन्य ने बताया, || पहले बाईं ओर अभिव्यक्ति का मूल्यांकन करता है। यदि यह "सत्य" है (false या nil को छोड़कर कुछ भी), तो यह वापस आता है। अन्यथा, यह दाईं ओर अभिव्यक्ति का मूल्यांकन करता है, और इसे वापस करता है (कोई फर्क नहीं पड़ता कि यह क्या है)।

यह || केवल बूलियन परीक्षणों से बहुत अधिक के लिए उपयोगी बनाता है। उदाहरण के लिए, मैं सिर्फ यह दूसरे दिन का इस्तेमाल किया जब chronic मणि के लिए कुछ कोड लिखने:

@now = options[:now] || Chronic.time_class.now 

इसका मतलब है कि: "अगर options हैश एक :now मूल्य भी शामिल है, की दुकान है कि @now में नहीं तो, वापस Chronic.time_class.now पर गिर जाते हैं। डिफ़ॉल्ट रूप से"। मुझे यकीन है कि आप अपने कार्यक्रमों में बहुत से संभावित अनुप्रयोगों के बारे में सोच सकते हैं।

&& समान है: यह पहले बाईं ओर अभिव्यक्ति का मूल्यांकन करता है, और यदि यह false या nil का मूल्यांकन करता है, तो यह वापस आता है। अन्यथा, यह दाईं ओर अभिव्यक्ति का मूल्यांकन करता है, और इसे वापस करता है (कोई फर्क नहीं पड़ता कि यह क्या है)।

इसका मतलब है && केवल बूलियन परीक्षणों से बहुत अधिक के लिए उपयोगी है। आप कोड की दो पंक्तियों को एक में निचोड़ने के लिए इसका उपयोग कर सकते हैं। उदाहरण के लिए:

do_something && do_something_else 

(ही काम करता है कि अगर आप जानते हैं कि do_something के रिटर्न मान false या nil कभी नहीं होगा!)

तुम भी && उपयोग कर सकते हैं एक ही पर एक "गार्ड" अभिव्यक्ति निचोड़ करने के लिए यह क्या है के रूप में लाइन "की रखवाली":

message && send_message(message) 

कौन सा बदल सकते:

unless message.nil? 
    send_message(message) 
end 
+0

मैं अभी भी रूबी सीख रहा हूं लेकिन यह वास्तव में सहायक है। – user1538814

संबंधित मुद्दे