2013-09-04 2 views
14

एक अजीब मामला देखा आ, यहाँ क्या हो रहा है पता लगाने की कोशिश:ब्लॉक वाक्य रचना अंतर का कारण बनता है "LocalJumpError: कोई (उपज) दिए गए ब्लॉक"

> def test 
> p yield 
> end 
=> nil 
> test { 1 } 
1 
=> 1 
> p test { 1 } 
1 
1 
=> 1 
> p test do 
> 1 
> end 
LocalJumpError: no block given (yield) 
+0

यहां जवाब है ... http://stackoverflow.com/questions/533008/what-is-the-difference-or-value-of-these-block-coding-styles-in-ruby/533040# 533040 –

+0

यहां उत्तर है - http://stackoverflow.com/questions/2122380/using-do-block-vs-brackets?lq=1 –

+1

यही कारण है कि आप ब्रांड्स का उपयोग करते हैं, भले ही रूबी आपको चुनने देता है। – Linuxios

उत्तर

16

पार्सर इस

p test do 
    1 
end 
पहचानता

इस

(p test) do 
    1 
end 

के रूप में ब्लॉक testp test के परिणाम के लिए, नहीं पारित हो जाता है । इसलिए, yield उस त्रुटि को उत्पन्न नहीं कर सकता है और उठा सकता है।

11

do औरविधियों से जुड़े ब्लॉक को इंगित करने के लिए पूरी तरह से विनिमय नहीं कर सकते हैं।

p test do 
    1 
end 

पूर्वता आप के साथ पंगा लेना है। यह वास्तव में यह है:

p(test()) do 
    1 
end 

तो ब्लॉक p, नहीं test को पारित कर दिया हो रही है।

{}do से अधिक प्राथमिकता है, और इसलिए वाक्य रचनात्मक रूप से नज़दीकी विधि से अधिक कसकर बांधता है। यह अन्य रूबी कीवर्ड के लिए भी सच है जिनमें प्रतीकात्मक समकक्ष हैं, जैसे कि and/&& और or/||, यही कारण है कि प्रतीकों को आम तौर पर शब्दों पर अनुशंसित किया जाता है।

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