У мене клас:
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).
TestClass.instance_methods
або без усіх успадкованих методів
TestClass.instance_methods - Object.methods
(Було 'TestClass.methods - Object.methods')
TestClass.methods(false)
.
TestClass.methods(false)
повертається порожнім
method1
, method2
або method3
, оскільки це методи екземплярів класу, а не методи самого TestClass
об'єкта.
Ви можете отримати більш детальний список (наприклад, структурований за визначенням класу) з такими дорогоцінними каменями, як налагодження або looksee .
$ 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
Відповідно до методів Ruby Doc instance_methods
Повертає масив, що містить назви загальнодоступних та захищених методів екземпляра у приймачі. Для модуля це загальнодоступні та захищені методи; для класу вони є методами екземпляра (не однотонними). Якщо необов'язковий параметр false, методи будь-яких предків не включаються. Я беру приклад з офіційної документації.
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)