2010-03-17 12 views
30

में तर्क के रूप में एकाधिक कोड ब्लॉक पास करना मेरे पास एक विधि है जो कोड ब्लॉक लेती है।रुबी

def opportunity 
    @opportunities += 1 
    if yield 
    @performances +=1 
    end 
end 

और मैं इसे इस तरह कहते हैं:

opportunity { @some_array.empty? }

लेकिन मैं इसे कैसे एक से अधिक कोड ब्लॉक इतना है कि मैं उपज इस्तेमाल कर सकते हैं दो बार इस तरह से पारित करते हैं, कुछ:

def opportunity 
    if yield_1 
    @opportunities += 1 
    end 
    if yield_2 
    @performances +=1 
    end 
end 

और:

opportunity {@some_other_array.empty?} { @some_array.empty? } 

मुझे पता है कि यह उदाहरण उपज के बिना किया जा सकता है, लेकिन यह सिर्फ उदाहरण के लिए है।

उत्तर

52

आप एक से अधिक ब्लॉक, दर असल पारित नहीं हो सकता है, लेकिन आप एक से अधिक procs या lambdas पारित कर सकते हैं:

1.9 वाक्य रचना का उपयोग करना:

def opportunity(lambda1, lambda2) 
    if lambda1.() 
    @opportunities += 1 
    end 
    if lambda2.() 
    @performances += 1 
    end 
end 
:

opportunity ->{ @some_array.empty? }, ->{ @some_other_array.empty? } 

और विधि अपने आप में

+0

क्या यह घोषणा करने का दूसरा तरीका है कि – user5020

+1

Proc.new {} या lambda {} भी काम करता है। कोई भी ऑब्जेक्ट जो 'कॉल' का जवाब देता है, – Kylee

+0

कार्य करेगा '।() '' Call' का उपनाम है? – MrYoshiji