एक वर्ग के उदाहरण के तरीकों की सूची प्राप्त करें


जवाबों:


115

आप वास्तव में चाहते हैं TestClass.instance_methods, जब तक आप TestClassखुद क्या कर सकते हैं में रुचि रखते हैं।

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

TestClass.methods.grep(/method1/) # => []
TestClass.instance_methods.grep(/method1/) # => ["method1"]
TestClass.methods.grep(/new/) # => ["new"]

या आप ऑब्जेक्ट पर कॉल methods(नहीं instance_methods) कर सकते हैं :

test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]

3
हे, आपने मुझे 47 सेकंड तक हरा दिया। +1
फ़रोज़

2
जब मैं कोशिश करता हूं print TestClass.new.instance_methods, मुझे यह त्रुटि मिलती हैmy_class.rb:10:in <main>: undefined method instance_methods for #<TestClass:0x96b9d20> (NoMethodError)
व्लादिमीर त्सुकानोव

आपको केवल करने की आवश्यकता है TestClass.new.methods। शायद "यह" मेरे जवाब में अस्पष्ट था।
एंड्रयू ग्रिम

ध्यान दें कि रूबी 1.9+ के तहत विधि नामों का सरणी प्रतीक हैं, तार नहीं।
फ्रॉग्ज

1
@Phrogz: हाँ, लेकिन आपको उन पर नियमित अभिव्यक्ति का उपयोग करने की अनुमति है। तुम भी Cthulhu को बुलाने मत! :) हालांकि आप [:method1]इसके बजाय मिल जाएगा।
एंड्रयू ग्राम

113
TestClass.methods(false) 

केवल उन विधियों को प्राप्त करने के लिए जो केवल उस वर्ग से संबंधित हैं।

TestClass.instance_methods(false) आपके दिए गए उदाहरण से तरीके लौटाएंगे (क्योंकि वे टेस्टक्लास के उदाहरण हैं)।


2
यह परीक्षण करने का एक शानदार तरीका है यदि किसी वर्ग ने छद्म इंटरफ़ेस / सार आधार वर्ग से बहुरंगी विधियां प्राप्त की हैं, तो सीधे तरीकों को आज़माने और कॉल करने के लिए बिना।
डैनियल डोज़ेमा

2
स्वीकृत उत्तर बहुत अच्छा है, लेकिन यह एक संभावना है कि अधिक लोग यहां किस लिए आएंगे!
हारून

यह निश्चित रूप से स्वीकृत उत्तर होना चाहिए। धन्यवाद!
विनीसियस ब्रासिल

38
TestClass.instance_methods

या सभी विरासत में मिली विधियों के बिना

TestClass.instance_methods - Object.methods

(क्या था टेस्टक्लास.मैथोड्स - ऑब्जेक्ट.मिथोड्स ’)


25
या विरासत में मिली विधियों के बिना TestClass.methods(false):।
आरा

2
@ सवा TestClass.methods(false)खाली लौटता है
व्लादिमीर

1
यह उत्तर गलत है; परिणाम शामिल होंगे नहीं method1, method2या method3, उन लोगों के रूप में तरीके हैं उदाहरणों वर्ग के, के तरीकों नहीं TestClassवस्तु ही।
फ्रॉग्ज

1
@Phrogz: उफ़ ... हाँ, 'TestClass.instance_methods - Object.methods', या 'TestClass.new.methods - Object.methods' ... जो मुझे सांत्वना नहीं देने के लिए सिखाएगा। क्या मेरे लिए यह उत्तर हटाना या उसे संपादित करना सबसे अच्छा है?
जूना

1
@Pavling निश्चित रूप से अपने उत्तर को सही होने के लिए संपादित करें। (जल्दी, ओपी किसी और को क्रेडिट
सौंपने से पहले


6
$ irb --simple-prompt

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

tc_list = TestClass.instance_methods(false)
#[:method1, :method2, :method3]
puts tc_list
#method1
#method2
#method3

2
यह अन्य उत्तरों के समान है और अतिरिक्त जानकारी या स्पष्टता नहीं जोड़ता है।
सबस्टैंट

3
आपने इसका उल्लेख करने में बहुत देर की है। : डी
डगलस जी। एलन

2

रूबी डॉक्टर के अनुसार instance_methods

एक सरणी देता है जिसमें रिसीवर में सार्वजनिक और संरक्षित उदाहरण विधियों के नाम होते हैं। एक मॉड्यूल के लिए, ये सार्वजनिक और संरक्षित तरीके हैं; एक वर्ग के लिए, वे उदाहरण हैं (सिंगलटन नहीं) विधियाँ। यदि वैकल्पिक पैरामीटर गलत है, तो किसी भी पूर्वजों के तरीके शामिल नहीं हैं। मैं आधिकारिक प्रलेखन उदाहरण ले रहा हूं।

module A
  def method1()  
    puts "method1 say hi"
  end
end
class B
  include A #mixin
  def method2()  
     puts "method2 say hi"
  end
end
class C < B #inheritance
  def method3() 
     puts "method3 say hi"
  end
end

चलिए आउटपुट देखते हैं।

A.instance_methods(false)
  => [:method1]

A.instance_methods
  => [:method1]
B.instance_methods
 => [:method2, :method1, :nil?, :===, ...# ] # methods inherited from parent class, most important :method1 is also visible because we mix module A in class B

B.instance_methods(false)
  => [:method2]
C.instance_methods
  => [:method3, :method2, :method1, :nil?, :===, ...#] # same as above
C.instance_methods(false)
 => [:method3]

1

केवल स्वयं के तरीके प्राप्त करने के लिए, और विरासत में प्राप्त लोगों को बाहर करें:

उदाहरण के भीतर से:

self.methods - self.class.superclass.instance_methods

बाहर से:

TestClass.instance_methods - TestClass.superclass.instance_methods

इसे कक्षा में जोड़ें:

class TestClass
  class << self
    def own_methods
      self.instance_methods - self.superclass.instance_methods
    end
  end
end

TestClass.own_methods
=> [:method1, :method2, method3]

(रूबी 2.6.x के साथ)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.