मुझे कक्षा में जाना है:
class TestClass
def method1
end
def method2
end
def method3
end
end
मैं कैसे (इस वर्ग में मेरी तरीकों की एक सूची प्राप्त कर सकते हैं method1
, method2
, method3
)?
मुझे कक्षा में जाना है:
class TestClass
def method1
end
def method2
end
def method3
end
end
मैं कैसे (इस वर्ग में मेरी तरीकों की एक सूची प्राप्त कर सकते हैं method1
, method2
, method3
)?
जवाबों:
आप वास्तव में चाहते हैं 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"]
print TestClass.new.instance_methods
, मुझे यह त्रुटि मिलती हैmy_class.rb:10:in <main>: undefined method instance_methods for #<TestClass:0x96b9d20> (NoMethodError)
TestClass.new.methods
। शायद "यह" मेरे जवाब में अस्पष्ट था।
[:method1]
इसके बजाय मिल जाएगा।
TestClass.methods(false)
केवल उन विधियों को प्राप्त करने के लिए जो केवल उस वर्ग से संबंधित हैं।
TestClass.instance_methods(false)
आपके दिए गए उदाहरण से तरीके लौटाएंगे (क्योंकि वे टेस्टक्लास के उदाहरण हैं)।
TestClass.instance_methods
या सभी विरासत में मिली विधियों के बिना
TestClass.instance_methods - Object.methods
(क्या था टेस्टक्लास.मैथोड्स - ऑब्जेक्ट.मिथोड्स ’)
TestClass.methods(false)
:।
TestClass.methods(false)
खाली लौटता है
method1
, method2
या method3
, उन लोगों के रूप में तरीके हैं उदाहरणों वर्ग के, के तरीकों नहीं TestClass
वस्तु ही।
$ 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
रूबी डॉक्टर के अनुसार 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]
केवल स्वयं के तरीके प्राप्त करने के लिए, और विरासत में प्राप्त लोगों को बाहर करें:
उदाहरण के भीतर से:
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 के साथ)