2012-05-16 12 views
6

मुझे आशा है कि मैं यहां किसी को दोहरा नहीं रहा हूं, लेकिन मैं Google और यहां खोज रहा हूं और कुछ भी नहीं आ रहा हूं। यह सवाल वास्तव में मेरे कोड को "लिंग देने" का विषय है।क्या रूबी में पास किए गए ब्लॉक के भीतर किसी विधि को पारित पैरामीटर को संदर्भित करना संभव है?

Dir.new('some_directory').each do |file| 
    # is there a way to refer to the string 'some_directory' via a method or variable? 
end 

धन्यवाद:

यह क्या मैं विशेष रूप से करने के लिए कोशिश कर रहा हूँ है!

उत्तर

7

सामान्य रूप से नहीं; यह पूरी तरह से विधि के लिए है कि ब्लॉक के साथ क्या तर्क कहा जाता है, और each को कॉल किया गया है (जो आपके ब्लॉक को कॉल करता है), तथ्य यह है कि स्ट्रिंग 'some_directory'Dir.new को पारित कर दिया गया है, यानी वे काफी भूल गए हैं अलग चीजें

आप इसी प्रकार कुछ कर सकते हैं, हालांकि:

Dir.new(my_dir = 'some_directory').each do |file| 
    puts "#{my_dir} contains #{file}" 
end 
+1

ओउओ, मुझे वह पसंद है! मुझे यह भी पता नहीं था कि कानूनी था। मैं अभी भी एक रूबी एन 00 बी हूँ। क्षमा करें, मैं आपको वोट नहीं दे सकता, मुझे अभी तक कोई प्रतिष्ठा नहीं मिली है। –

+0

यानी, यह वही है जो मैं ढूंढ रहा था। मैं बस कोड की एक पंक्ति को बचाने की कोशिश कर रहा था और यह है :) –

+0

:)! चीजों को कॉम्पैक्ट बनाने का यह एक अच्छा तरीका है, लेकिन सबसे अच्छी चीजों की तरह, अत्यधिक उपयोग करने से अपठनीय कोड हो जाएगा, इसलिए मैं इसे कम से कम उपयोग करता हूं या कहां समझता हूं। (मुझे लगता है कि यह समझ में आता है।) – Ashe

2

कारण यह काम नहीं करेगा कि new और each दो अलग-अलग विधियां हैं इसलिए उनके पास एक-दूसरे के पैरामीटर तक पहुंच नहीं है।

def do_something(dir) 
    Dir.new(dir).each do |file| 
    # use dir in some way 
    end 
end 

तथ्य यह है कि एक नई विधि बनाने जैसे एक कम भूमि के ऊपर का मतलब है यह पूरी तरह से है: 'sexify' अपने कोड के लिए, आप एक नई पद्धति बनाने दो विधि कॉल होते हैं और है कि करने के लिए बार-बार पैरामीटर पारित करने के लिए विचार कर सकते हैं इस तरह के कोड के छोटे हिस्से के लिए एक बनाने के लिए उचित है - और यह उन कई कारणों में से एक है जो रूबी को काम करने के लिए एक भाषा का आनंद देते हैं।

+0

कूल; मुझे उससे डर है। मुझे पता है कि मैं सिर्फ एक चर के लिए 'some_directory' असाइन कर सकता हूं लेकिन मैं खुद को एक पूरी लाइन को बचाने की कोशिश कर रहा था :) धन्यवाद! –

+0

कोई समस्या नहीं! :-) – Russell

+0

वाह, जाहिर है, मैं यहां जानता था, लेकिन जब मैंने पहली बार जवाब दिया तो यह केवल आपके उत्तर की पहली पंक्ति दिखा रहा था। लोग यहां इतनी जल्दी प्रतिक्रिया देते हैं! सबको शुक्रीया! –

0

बस एक चर में इसे तोड़ दें। रूबी ब्लॉक बंद हैं इसलिए उनके पास पहुंच होगी -

dir = 'some_directory' 
Dir.new(dir).each do |file| 
    # use dir here as expected. 
end 
संबंधित मुद्दे

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