2016-09-22 5 views
9

http://guides.rubyonrails.org/layouts_and_rendering.html#avoiding-double-render-errors पर रेल गाइड के माध्यम से जाते समय मैं एक परीक्षण कार्यक्रम रूबी के && return परीक्षण करने के लिए लिखा था, और मैं इस अजीब व्यवहार मिल गया:रूबी: बनाम "वापस &&" "और वापसी"

def test1 
    puts 'hello' && return 
    puts 'world' 
end 

def test2 
    puts 'hello' and return 
    puts 'world' 
end 

यह वह जगह है परिणाम आउटपुट:

irb(main):028:0> test1 
=> nil 
irb(main):029:0> test2 
hello 
world 
=> nil 

अंतर के लिए क्या खाते हैं?

+0

यहां इस बारे में अच्छी चर्चा: https://www.ruby-forum.com/topic/217700 – Yarin

उत्तर

16

the difference between and and && देखें। उदाहरणों में आप विधि puts को इसके तर्कों के चारों ओर माता-पिता के बिना बुलाए जाते हैं और प्राथमिकता में अंतर यह बदलता है कि इसे कैसे पार्स किया जाता है।

परीक्षण 1 && में विधि कॉल की तुलना में अधिक प्राथमिकता है। तो वास्तव में क्या हो रहा है puts('hello' && return) है। उन तरीकों से पहले तर्कों का हमेशा मूल्यांकन किया जाता है - इसलिए हम पहले 'hello' && return का मूल्यांकन करते हैं। चूंकि 'hello' सच्चाई है कि बुलियन शॉर्ट सर्किट नहीं करता है और return का मूल्यांकन किया जाता है। जब वापस आते हैं तो हम कुछ और किए बिना विधि से बाहर निकलते हैं: इसलिए कुछ भी कभी लॉग नहीं होता है और दूसरी पंक्ति नहीं चलती है।

परीक्षण 2 and में विधि कॉल की तुलना में कम प्राथमिकता है। तो puts('hello') and return क्या होता है। puts विधि लॉग करता है जो इसे पास किया जाता है और फिर nil देता है। nil एक झूठा मूल्य है इसलिए and अभिव्यक्ति शॉर्ट सर्किट और return अभिव्यक्ति का मूल्यांकन कभी नहीं किया जाता है। हम सिर्फ दूसरी लाइन पर जाते हैं जहां puts 'world' चलाया जाता है।

+0

धन्यवाद !! मुझे पता है कि समस्या क्या है ~~ लेकिन मैं नहीं देख सकता कि "&& विधि कॉल की तुलना में अधिक प्राथमिकता है।" http://phrogz.net/ProgrammingRuby/language.html#table_18.4 में मौजूद है, मैं इसे साबित नहीं कर सकता ... – Spec

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