2012-01-13 17 views
25

किसी ऑब्जेक्ट को देखते हुए मैं #public_methods पर कॉल कर सकता हूं और सभी विधियों को देख सकता हूं। हालांकि, मुझे लगता है कि यह कभी-कभी उन सभी सार्वजनिक विधियों की त्वरित सूची प्राप्त करने के लिए आसान होगा जो विरासत में नहीं हैं, यानी वह सामान जो वास्तव में इस वर्ग का हिस्सा है।विरासत विधियों के बिना कक्षा के सार्वजनिक तरीकों को मैं कैसे प्राप्त करूं?

मैं "Easy way to list public methods for a Ruby object" में पाया है कि अगर मैं का उपयोग करें:

(Foo.public_methods - Object.public_methods).sort 

मैं बुनियादी रूबी सामान का एक बहुत फ़िल्टर कर सकते हैं। मैं श्रृंखला को हर तरह से विरासत में मिला था सब कुछ फ़िल्टर करने में सक्षम होना चाहता हूँ। अगर मैं अभिभावक वर्ग को जानता हूं तो मैं इसका उपयोग कर फ़िल्टर कर सकता हूं, लेकिन मैं एक सामान्य कमांड के साथ आना चाहता हूं जो किसी भी ऑब्जेक्ट के लिए अनर्जित सार्वजनिक तरीकों की एक सरणी वापस कर सकता है।

उत्तर

45

बस public_methods की inherited तर्क के लिए false पारित:

"hello".public_methods.include?(:dup) # => true 
"hello".public_methods(false).include?(:dup) # => false 

नहीं आपके प्रश्न का उत्तर है, लेकिन मामले में आप नहीं जानते थे, irb, स्वतः पूर्ण करता है तो यह जनता की सूची प्राप्त करने के लिए आसान है विधियों (विशेष रूप से यदि आप जिस विधि की तलाश कर रहे हैं उसकी शुरुआत को जानते हैं)। बस टैब हिट करें; (, विरासत में मिला भी शामिल होते हैं, हालांकि) दो बार इसे मारने के लिए सभी संभावनाओं सूची जाएगा:

> "nice".d<tab><tab> 
"nice".delete  "nice".delete! "nice".display "nice".downcase     
"nice".downcase! "nice".dump  "nice".dup  "nice".define_singleton_method 

> "nice".<tab><tab> 
Display all 162 possibilities? (y or n) 
... 

pry का उपयोग करता है यह और भी आसान तरीकों, उपलब्ध उत्तराधिकार के स्तर के आधार पर विभाजित करने के लिए:

[1] pry(main)> cd "nice" 
[2] pry("nice"):1> ls 
Comparable#methods: < <= > >= between? 
String#methods: % * + << <=> == === =~ [] []= ascii_only? bytes bytesize byteslice capitalize capitalize! casecmp center chars chomp chomp! chop chop! chr clear codepoints concat count crypt delete delete! downcase downcase! dump each_byte each_char each_codepoint each_line empty? encode encode! encoding end_with? eql? force_encoding getbyte gsub gsub! hash hex include? index insert inspect intern length lines ljust lstrip lstrip! match next next! oct ord partition prepend replace reverse reverse! rindex rjust rpartition rstrip rstrip! scan setbyte shellescape shellsplit size slice slice! split squeeze squeeze! start_with? strip strip! sub sub! succ succ! sum swapcase swapcase! to_c to_f to_i to_r to_s to_str to_sym tr tr! tr_s tr_s! unpack upcase upcase! upto valid_encoding? 
locals: _ _dir_ _ex_ _file_ _in_ _out_ _pry_ 
+0

क्या आपका मतलब 'irb' या 'irc' था? :-) –

+0

वास्तव में, 'irb'। आपको धन्यवाद और @Mu –

+0

आह, सुपर सहायक! मुझे एहसास नहीं हुआ कि 'public_methods' ने किसी भी तर्क को स्वीकार किया है, और यह जांचने के लिए मेरे पास भी नहीं हुआ। धन्यवाद! – Andrew

5

ले लो एक Module#instance_methods

को देखने के लिए आप निम्न का उपयोग कर सकते हैं:

class A 
    def method_1 
    puts "method from A" 
    end 
end 

class B < A 
    def method_2 
    puts "method from B" 
    end 
end 

B.instance_methods  # => [:method_1, :method_2, ...] 
B.instance_methods(false) # => [:method_2] 

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

  • कोई संबंधित समस्या नहीं^_^