2011-10-19 12 views
8

आईएफ ब्लॉक में मुझे यह जांचने की ज़रूरत है कि कुछ शर्त सही है और यदि यह करता है, तो ब्लॉक से बाहर निकलें।रूबी - आईएफ ब्लॉक से बाहर निकलें

#something like this 
if 1 == 1 
    return if some_object && some_object.property 
    puts 'hello' 
end 

मैं यह कैसे कर सकता हूं?

उत्तर

12

आप नहीं तोड़ सकते हैं if से बाहर की तरह। आप क्या कर सकते यह करने के लिए एक सब-क्लॉज जोड़ने है:

if (cond1) 
    unless (cond2) 
    # ... 
    end 
end 

आप अपने तर्क भी नेस्टेड होने के साथ समस्या हो रही है और आप बेहतर इसे बाहर समतल करने का एक तरीका की जरूरत है, हो सकता है कि आप क्या करना चाहते है पहले से एक चर की गणना और उसके बाद ही में गोता अगर आप की जरूरत करने के लिए:

will_do_stuff = cond1 
will_do_stuff &&= !(some_object && some_object.property) 

if (will_do_stuff) 
    # ... 
end 

तरीके break करने के लिए इसे बिना एक गहरा आंतरिक संरचना से बचने के लिए की एक संख्या है।

+2

+1, जो स्थिति को नाम देता है। एक अच्छा नाम पठनीयता में काफी सुधार करेगा। –

+0

मैं आपको इससे बचने और यदि आपको आवश्यकता हो तो अधिक तरीकों को परिभाषित करने की सलाह दूंगा। यह वह पैटर्न है जो रेल का उपयोग करता है और यह बहुत अच्छी तरह से काम करता है। सबसे परमाणु चीज करने के तरीकों को विभाजित करें जिनके साथ आप रह सकते हैं - इस मामले में, एक ही कक्षा/वस्तु में एक और (निजी?) विधि का उपयोग इस स्थिति का परीक्षण करने के लिए किया जा सकता है। जैसे 'def will_parse? (obj); ! Obj.nil? && obj.respond_to? (: पार्स) && obj.is_ready_and_willing ?; अंत ' – coreyward

+0

यह क्या है" && = "? –

2

उन चीज़ों को चुनने में सावधानी बरतें जिन्हें आप चीजों से जोड़ते हैं। चूंकि रूबी के पास ब्लॉक हैं, मुझे यकीन नहीं है कि आप इस धारणा के तहत हैं कि एक सशर्त बयान एक ब्लॉक है।

# will NOT work: 
block = Proc.new { puts "Hello, world." } 
if true then block 

आप एक नेस्टेड सशर्त की आवश्यकता है, तो आप सिर्फ इतना है कि चीजें किसी भी उलझी बिना कर सकते हैं:: आप नहीं, उदाहरण के लिए, निम्न कर सकते हैं

if condition_one? 
    if condition_two? 
    # do some stuff 
    end 
else 
    # do something else 
end 
+0

यह थोड़ा भ्रामक है, क्योंकि अगर आपने उस पहले स्निपेट की दूसरी पंक्ति को 'सत्य कहा तो ब्लॉक.call end' में बदल दिया है तो यह – DaveMongoose

+0

@ डेवमोन्गोज़ काम करेगा क्योंकि ऐसा है क्योंकि आप 'कॉल' विधि को कॉल कर रहे हैं प्रो उदाहरण, लेकिन डाउनवोट – coreyward

+0

के लिए धन्यवाद रूबी में कुछ का एक काउंटर उदाहरण है जो एक ब्लॉक है लेकिन एक प्रोसेस उदाहरण (जैसे 'ब्लॉक') के लिए प्रतिस्थापित किया जा सकता है? मुझे लगता है कि यदि आप इसे स्पष्ट ब्लॉक के स्थान पर उपयोग कर रहे हैं तो वाक्यविन्यास को 'और ब्लॉक' होना आवश्यक है। – DaveMongoose

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

  • कोई संबंधित समस्या नहीं^_^