2011-10-17 11 views
12

में एक वस्तु के तरीकों मैं एक छोटे से गहरे लाल रंग का (1.9) दुभाषियामाणिक

class Foo 
    def pub 
    private_thing 
    end 

    private 
    def private_thing 
    puts "private touch" 
    end 
end 



x = Foo.new 
x.pub 
private touch 
=> nil 

अब तक तो अच्छा से इस व्यवहार को लेकर संदेह में हूँ मिलता है।

x.private_thing 
NoMethodError: private method `private_thing' called for #<Foo:0xb76abd34> 
from (irb):25 
from :0 

अभी भी ठीक है। यही मुझे उम्मीद है कि

लेकिन यह खाली क्यों है?

x.methods(false) 
=> [] 

जबकि यह मुझे वह चीज़ देता है जो मैं उम्मीद कर रहा था?

Foo.instance_methods(false) 
=> ["pub"] 

उत्तर

7

दरअसल, "विधियों" विधि गायब हो गई प्रतीत होती है। आपको इसके बजाय public_instance_methods का उपयोग करना चाहिए।

यह समझाने के लिए कि x.methods(false) इस तरह से व्यवहार क्यों कर रहा है, रूबी 1.9.1 डॉक्स http://www.ruby-doc.org/core-1.9.1/Object.html#method-i-methods पर वापस देखें। यदि आप पैरामीटर में पास करते हैं तो स्रोत कोड देखते हैं, तो यह सिंगलटन_मेथ्स के रूप में व्यवहार करता है, जो आप बैठ रहे हैं।

1

ऐसा लगता है कि ऑब्जेक्ट # विधियों के लिए रूबी 1.9.1 से परे कोई दस्तावेज नहीं है। जैसे कि यह अब मौजूद नहीं है। (http://www.ruby-doc.org/core-1.9.3/Object.html देखें)

मुझे लगता है कि यह स्पष्ट करना है कि किसी को .singleton_methods या .instance_methods का उपयोग करना चाहिए ताकि यह निर्धारित किया जा सके कि विधियां कहाँ रहते हैं।

किसी भी मामले में, एक अनियंत्रित विधि जो कुछ भी पसंद कर सकती है वह कर सकती है।