2012-02-27 32 views
7

अपने ब्लॉक में instance_eval विधि परिवर्तन स्वयं, जैसे:example_eval विधि जैसे ब्लॉक में स्वयं को कैसे बदलें?

class D; end 
d = D.new 
d.instance_eval do 
    puts self # print something like #<D:0x8a6d9f4>, not 'main'! 
end 

हम एक विधि ourself (या किसी अन्य तरीके (instance_eval के अलावा अन्य) जो एक ब्लॉक लेता है), जब प्रिंट स्वयं, हम 'मुख्य मिल जाएगा निर्धारित करते हैं 'है, जो instance_eval method.eg से अलग है:

[1].each do |e| 
    puts self # print 'main' 
end 

कैसे मैं एक विधि instance_eval की तरह (जो एक ब्लॉक लेता है) को परिभाषित कर सकते हैं? अग्रिम धन्यवाद।

+0

हासिल करना चाहते हैं क्या करें? – megas

+0

मुझे नहीं लगता कि आप जो चाहते हैं उसे करना संभव है। शायद क्योंकि आप स्वयं को बदल सकते हैं तो यह बहुत भ्रमित होगा। –

उत्तर

7

आप एक विधि है कि एक proc तर्क स्वीकार करता है लिख सकते हैं, और उसके बाद से पारित है कि एक proc तर्क instance_eval के रूप में।

class Foo 
    def bar(&b) 
    # Do something here first. 
    instance_eval &b 
    # Do something else here afterward, call it again, etc. 
    end 
end 

Foo.new.bar {डालता स्वयं}

पैदावार

#<Foo:0x100329f00> 
+0

मैं समझता हूं कि आपका क्या मतलब है, लेकिन मेरी समस्या हल नहीं हुई। मैं example_eval का उपयोग करने के बजाय example_eval जैसी विधि को परिभाषित करना चाहता हूं। मैं कार्यान्वयन चाहता हूं कि एक रैपर न हो। आप सबको धन्यवाद! – gaols

+1

आपको जो हासिल करना है, उसके बारे में आपको और अधिक विशिष्ट होने की आवश्यकता होगी। यदि आप बस एक विधि चाहते हैं जो ब्लॉक को स्वीकार कर सके, और उसके बाद इसे एक ही संदर्भ में उसी विधि के भीतर निष्पादित करें, तो यह ऐसा करता है। अगर मुझे लगता है, शायद आप ब्लॉक में भी तर्क पारित करना चाहते हैं? मुझे पता है कि यह संभव है क्योंकि आरएसपीईसी करता है, और यह सच है कि यह उदाहरण नहीं है। मुझे आरएसपीसी कोड पर एक नज़र रखना चाहिए, और देखें कि वे इसे कैसे करते हैं। –

+0

असल में, मुझे लगता है कि आरएसपीईसी ब्लॉक को पार करने के लिए पास नहीं करता है, और यह ब्लॉक कॉल करने के लिए example_eval का उपयोग करता है। Http://rubydoc.info/gems/rspec-core/RSpec/Core/Example#run-instance_method देखें और "स्रोत देखें" पर क्लिक करें। –

3

यह स्पष्ट है:

class Object 
    def your_method(*args, &block) 
    instance_eval &block 
    end 
end 

receiver = Object.new 

receiver.your_method do 
    puts self #=> it will print the self of receiver 
end 
+0

क्षमा करें, मैं जो चाहता हूं वह एक विधि है जो एक ब्लॉक लेती है और उस ब्लॉक में स्वयं को रिसीवर में बदला जाता है, उदाहरण example_eval की तरह! – gaols

+0

आपकी मदद के लिए फिर से धन्यवाद! – gaols