2010-05-03 13 views
27

मैं जानता हूँ कि यह काम करता है:तर्क के साथ example_eval के साथ proc invoking?

proc = Proc.new do 
    puts self.hi + ' world' 
end 

class Usa 
    def hi 
    "Hello!" 
    end 
end 
Usa.new.instance_eval &proc 

हालांकि मैं proc के लिए तर्क पास करना चाहते हैं, तो मैं यह जो काम नहीं करता है की कोशिश की:

proc = Proc.new do |greeting| 
    puts self.hi + greeting 
end 

class Usa 
    def hi 
    "Hello!" 
    end 
end 
Usa.new.instance_eval &proc, 'world' # does not work 
Usa.new.instance_eval &proc('world') # does not work 

किसी को भी मदद कर सकते हैं मुझे यह काम?

+0

आपके पास एक टाइपो है। 'gsub! ("gretting", "ग्रीटिंग") ' –

+0

अब तय किया गया। उसके लिए माफ़ करना। धन्यवाद मार्क। –

उत्तर

50

के बजाय instance_exec का उपयोग करें जब आपको तर्क पारित करने की आवश्यकता हो।

proc = Proc.new do |greeting| 
    puts self.hi + greeting 
end 

class Usa 
    def hi 
    "Hello, " 
    end 
end 
Usa.new.instance_exec 'world!', &proC# => "Hello, world!" 

नोट: यह रूबी 1.8.7 के लिए नया है, इसलिए require 'backports' उन्नयन या यदि आवश्यक हो तो।

+2

क्या कुछ बैकपोर्ट्स * * नहीं कर सकता है? :-) –

+0

@ जोर्ग :-) काश वहाँ बहुत खराब कुछ चीजें 'विधि # source_location' या एन्कोडिंग सामान की तरह, पहुंच से बाहर हैं नहीं था ...। और 'instance_exec' मणि में सबसे उग्र हैक है ... –

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