2011-06-10 9 views
25

मैं कुछ प्रतिबिंब कर रहा हूं, और एक अप्रत्याशित सड़क ब्लॉक में भाग गया।रूबी विधि जो खुद को लौटती है

वहाँ रूबी (या रेल) ​​में एक वस्तु विधि है जो अपने आप रिटर्न

ruby-1.9.2> o = Object.new 
=> #<Object:0x00000104750710> 
ruby-1.9.2> o.class 
=> Object 
ruby-1.9.2> o.send :self 
NoMethodError: undefined method `self' for #<Object:0x00000104750710> 

मैं क्या चाहता हूँ

ruby-1.9.2> o.send :self 
=> #<Object:0x00000104750710> 

इस में बनाया गया है है? या मैं वस्तु का विस्तार करने की आवश्यकता है (यह हमेशा मुझे परेशान खोलने वस्तु हो जाता है):

class Object 

    def itself 
    self 
    end 

end 

और फिर इतना:

ruby-1.9.2> o.send :itself 
=> #<Object:0x00000104750710> 

ठीक है, मैं क्या हासिल करने की कोशिश कर रहा हूँ पर कुछ पृष्ठभूमि । मैं अपने रेल app में एक सामान्य तालिका सहायक है, और आप अगर की तरह तो फोन:

render_list @person, [{field: :name, link_to: :itself}, 
         {field: {address: :name}, link_to: :address}] 

मैं सही रास्ते पर संघर्ष कर रहा था :itself कॉल करने के लिए - लेकिन मैं सोच रहा हूँ कि मेरी पैच जाने का रास्ता है ।

+1

यह स्पष्ट नहीं है कि आप यहां क्या करने का प्रयास कर रहे हैं। जहां तक ​​मुझे पता है, 'स्वयं' इस मामले में बिल्कुल एक विधि नहीं है, लेकिन वर्तमान संदर्भ का संदर्भ है। क्या आप किसी भी तरह से 'ओ' से अलग होने की उम्मीद कर रहे हैं? – tadman

+0

यदि आप अपना अंतिम लक्ष्य क्या है इसका उदाहरण देते हैं तो हो सकता है कि लोग अधिक उपयोगी उत्तर प्रदान कर सकें? –

+0

@brett - जोड़ा – Jonathan

उत्तर

33

हां! यदि आपके पास रूबी 2.2.0 या बाद में है, तो आप Kernel#itself विधि का उपयोग कर सकते हैं। https://bugs.ruby-lang.org/issues/6373:

इस सुविधा को यहां की व्यापक चर्चा देख सकते हैं। पैच संदेश # 53 में राफेल फ्रांका द्वारा प्रस्तुत किया गया था।

आप object.c में देख कर अधिकारी रूबी स्रोत में देख सकते हैं।

+0

हाँ - यह बहुत अच्छा है! – Jonathan

+0

इसके अलावा, यदि आप रेल (या केवल सक्रिय समर्थन) का उपयोग कर रहे हैं, तो आपको यह भी पुराने रूबी संस्करणों पर होना चाहिए। – johncip

4

self ऑब्जेक्ट स्वयं है, इसे अतिरिक्त लाने की आवश्यकता नहीं है। अपने पैच के बाद, निम्न प्रयास करें:

>> a=[2,3,4] #=> [2, 3, 4] 
>> a == a.itself #=> true 
>> a.object_id #=> 71056290 
>> a.itself.object_id #=> 71056290 

... यह बिल्कुल वैसा ही

+0

जब भी आप "o.itself" का उपयोग करेंगे, तो आप केवल "ओ" का उपयोग कर सकते हैं। दूसरे शब्दों में, रूबी पैच करने की कोई ज़रूरत नहीं है। – Bira

+0

असल में यह समझ में आता है - '[1,2,3] .index_by (&: खुद) ', लेकिन अब मैं' lambda {| * x को परिभाषित करने की दिशा में अधिक इच्छुक हूं। x} 'वैश्विक स्तर पर –

+0

सुधार: लैम्ब्डा {| x | x} –

3

self है एक कीवर्ड डिफ़ॉल्ट रिसीवर की चर्चा करते हुए है। यह एक विधि नहीं है। उदाहरण के लिए this page देखें।

आपका itself विधि ठीक काम करता है। आप यह भी कह सकते हैं:

o.instance_eval('self') 

एक वर्ग के लिए, बजाय class_eval का उपयोग करें:

Object.class_eval('self') 
+6

' ओ के कार्यात्मक तरीके से हो सकता है .instance_eval ('self') 'ओ' कहने का एक सुंदर पागल तरीका है। – tadman

+1

@tadman - कभी-कभी जरूरी, यानी। मेरे मामले में मैं कुछ प्रतिबिंब कर रहा हूं जहां मुझे इस कार्यक्षमता की आवश्यकता है – Jonathan

5

आप रूबी संस्करण> = 1.9 उपयोग कर रहे हैं आप खाली ब्लॉक के साथ tap विधि का उपयोग कर सकते हैं:

Object.tap{}  => Object 
Object.new.tap{} => #<Object:0x5f41334> 
+0

साफ - मुझे इस विधि के बारे में कभी नहीं पता था – Jonathan

+3

दुर्भाग्य से आवश्यक ब्लॉक का मतलब है कि आप केवल एक संदर्भ के आसपास पास नहीं कर सकते हैं: अंधेरे से टैप करें, आपको हमेशा यह सुनिश्चित करना होगा इसे ब्लॉक के साथ बुलाओ। –

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