class Foo
def self.run(n,code)
foo = self.new(n)
@env = foo.instance_eval{ binding }
@env.eval(code)
end
def initialize(n)
@n = n
end
end
Foo.run(42, "p @n, defined? foo")
#=> 42
#=> "local-variable"
उपरोक्त नमूना कार्यक्रम का उद्देश्य Foo
उदाहरण के दायरे में मनमाने ढंग से कोड का मूल्यांकन करना है। यह ऐसा करता है, लेकिन बाध्यकारी code
विधि से स्थानीय चर के साथ "प्रदूषित" है। मैं eval'd कोड के लिए दृश्यमान होने के लिए foo
, n
, या code
नहीं चाहता। वांछित आउटपुट है:किसी ऑब्जेक्ट के दायरे में रिक्त बाध्यकारी बनाएं
#=> 42
#=> nil
मैं कैसे बना सकते हैं एक बंधन है कि (क) वस्तु उदाहरण के दायरे, लेकिन में (ख) किसी स्थानीय चर से रहित?
कारण यह है कि मैं सिर्फ instance_eval(code)
का उपयोग करने का एक बाध्यकारी बजाय बनाने रहा हूँ कि real usage में मैं keep the binding around for later usage की जरूरत है, स्थानीय यह में बनाया चर रक्षा करना है।
आपने कुछ स्थानीय चर हटा दिए हैं, लेकिन सभी नहीं: 'परिभाषित? (एन)' ''स्थानीय-परिवर्तनीय' है, जहां आपने 'बाध्यकारी' कहा था। यह क्लीनर है, लेकिन यह खाली नहीं है। – Phrogz
अद्यतन संस्करण रिक्त है? – phoet
हां, अद्यतन संस्करण काम करता है। धन्यवाद! नोट, हालांकि, यह हर बार 'बी' कहा जाता है जब यह एक नया खाली बाध्यकारी बनाता है। यदि आप यही चाहते हैं, तो जवाब सही है। अगर इसके बजाय मुझे-आप प्रत्येक रन से स्थानीय चर को जमा करने के लिए एक ही बाध्यकारी रखना चाहते हैं, तो आपको कुछ डीफ बी जैसे कुछ करने की आवश्यकता होगी; @b || = बाध्यकारी; end'।मैं आपको स्वीकृति दूंगा क्योंकि उदाहरण के प्रयोग से कुछ तरीकों से भंडारण एक अलग वस्तु (मेरे उत्तर में) की तुलना में अधिक सुरुचिपूर्ण है; अन्य तरीकों से यह आपके ऑब्जेक्ट पर एक नया इंस्टेंस वैरिएबल लागू करता है जिसे आप नहीं चाहते हैं। – Phrogz