2008-11-01 10 views
21

तो मैं एक रूबी विधि इस तरह मिल गया है:सिंटेक्स एक पंक्ति पर एक ब्लॉक डालने के लिए

def something(variable, &block) 
    .... 
end 

और मैं इस तरह इसे कहते हैं: कि 'isn छोड़कर

something 'hello' { do_it } 

मेरे लिए काम नहीं कर रहा हूं, मुझे एक वाक्यविन्यास त्रुटि मिल रही है। मैं बजाय ऐसा करते हैं, यह काम करता है:

something 'hello' do 
    do_it 
end 

वहाँ सिवाय मैं एक तरह से यह एक पंक्ति में होने का अच्छा लग याद कर रहा हूँ।

मैं देख सकता हूं कि यह क्यों हो रहा है, क्योंकि ऐसा लगता है कि यह एक दूसरे चर के रूप में पास किया जा रहा है, लेकिन चर के बीच में अल्पविराम के बिना ... लेकिन मुझे लगता है कि निपटने का एक तरीका होना चाहिए यह है कि मैं याद कर रहा हूँ। है?

उत्तर

32

आप अपने तर्क बीच में लिखना करने की जरूरत है।

+0

हाँ, यह करता है !! धन्यवाद। कभी-कभी यह सबसे यादगार चीजें हैं जिन्हें आप याद करते हैं ;-) –

+0

@ कैमर बूथ: तो शायद आप उसका जवाब स्वीकार कर सकते हैं? :) – Pistos

1

यदि आप किसी ब्लॉक को स्वीकार करने के लिए "कुछ def" चाहते हैं, तो आपको उस ब्लॉक पर डेटा उपज करने की आवश्यकता है। उदाहरण के लिए:

something('hello') { do_it } 

यही काम करना चाहिए:

#to uppercase string 
def something(my_input) 
yield my_input.upcase 
end 

# => "HELLO WORLD" 
something("hello world") { |i| puts i} 
+0

जरूरी सच नहीं है यही कारण है कि। आप कुछ भी नहीं कमा सकते हैं, ब्लॉक को किसी अन्य विधि में पास कर सकते हैं, या इसे अनदेखा करना चुन सकते हैं। ब्लॉक में कुछ भी पैदा करने की कोई विशिष्ट आवश्यकता नहीं है। जिस तरह से मूल प्रश्न में लिखा गया था, ब्लॉक पासवाड को 'ब्लॉक' नामक 'प्रो' में परिवर्तित कर दिया जाएगा। – nertzy

0

उह, किस बारे में:

>> def something(arg1 , &block) 
>> yield block 
>> end 
=> nil 
>> def do_it 
>> puts "Doing it!" 
>> end 
=> nil 
>> something('hello') { do_it } 
"Doing it!" 
=> nil 
संबंधित मुद्दे