2009-11-13 16 views
15

का उपयोग करते समय स्वयं के लिए मूल्य प्रदान करें रूबी में एक लैम्ब्डा फ़ंक्शन को कॉल करने के लिए प्रो # कॉल का उपयोग करते समय, self फ़ंक्शन को परिभाषित करते समय उस मान के साथ हमेशा समाप्त होता है, जब फ़ंक्शन परिभाषित होता है कहा जाता है, उदाहरण के लिए:प्रो # कॉल

$p = lambda { self } 

class Dummy 
    def test 
    $p.call 
    end 
end 

d = Dummy.new 

> d.test 
=> main 

test रिटर्न main, जब मैं क्या वापस जाने के लिए यह इरादा #<Dummy:0xf794> है कॉलिंग - Dummy का एक उदाहरण है, जो कोड है, जहां मैं $p कहा जाता है में बिंदु पर self का मूल्य था।

जावास्क्रिप्ट में, मैं केवल ऑब्जेक्ट पास कर दूंगा कि मैं call पर पहला तर्क के रूप में "कैली" बनना चाहता हूं। जब मैं एक Proc फोन वहाँ रूबी में किसी भी तरह के कार्यक्षमता, मुझे एक मनमाना वस्तु स्थापित करने के लिए अनुमति देता है कम से कम self की वर्तमान मूल्य है, या, self के लिए नए मूल्य के रूप में?

+0

मैंने सोचा था कि '$ p.bind (some_object) 'काम कर सकता है, लेकिन स्पष्ट रूप से' बाइंड 'केवल' UnboundMethod' ऑब्जेक्ट के साथ काम करता है। क्या एक proc को unboundMethod में घुमाया जा सकता है? –

उत्तर

15

आप instance_eval है, जो फोन करने वस्तु के संदर्भ में एक लैम्ब्डा का मूल्यांकन करता है के लिए देख रहे हैं।

>> $p = proc { self } 
=> #<Proc:[email protected](irb):1 (lambda)> 
>> class Dummy 
>> def test 
>>  $p.call 
>> end 
>> 
>> def test1 
>>  instance_eval(&$p) 
>> end 
>> end 

>> d = Dummy.new 
=> #<Dummy:0x946f7c8> 
>> d.test 
=> main 
>> d.test1 
=> #<Dummy:0x946f7c8> 
+1

जब मैं इस फैशन में' instance_eval' करने के लिए एक ब्लॉक भेजने का प्रयास करें, मैं हमेशा त्रुटि 'ArgumentError मिलता है। मुझे लगता है कि @ श्वार्डर्ड का जवाब अब सही जवाब है। – nzifnab

+0

'lamda' की बजाय 'proc' का उपयोग करना 'ArgumentError: तर्कों की गलत संख्या (0 के लिए 1)' अपवाद को हल करना चाहिए। –

+0

धन्यवाद जैकोब, मैंने कोड अपडेट किया है –

1

लैम्ब्डा को बंद करने की यह पर्यावरण यह था जब यह परिभाषित किया गया था संपुटित होगा जिसका मतलब है परिभाषित करता है। यदि आप स्वयं को कॉलर बनना चाहते हैं तो बस एक नियमित विधि या बेहतर परिभाषित करें, फिर भी एक ब्लॉक का उपयोग करें।

+0

धन्यवाद - मुझे पता है कि लैम्ब्डा एक बंद बनाता है, और मैं समझाया पर्यावरण तक पहुँच बनाए रखने के लिए, लेकिन सिर्फ एक विशेष चर 'self' ओवरराइड करना चाहते हैं। क्या आपके पास कोई विचार है कि मैं यह कैसे कर सकता हूं? तर्कों की गलत संख्या (1 0 के लिए) ': –

19

आप instance_exec उपयोग करने के लिए है क्योंकि यह आप ब्लॉक करने के लिए तर्क पारित करने के लिए जबकि instance_eval नहीं है की अनुमति देता है सकते हैं।

def eval_my_proc_with_args(*args, &block) 
    instance_exec(*args, &block) 
end 
संबंधित मुद्दे