У меня есть класс:
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"]
TestClass.methods(false)
чтобы получить только те методы, которые принадлежат только этому классу.
TestClass.instance_methods(false)
вернет методы из вашего данного примера (поскольку они являются экземплярами метода TestClass).
TestClass.instance_methods
или без всех унаследованных методов
TestClass.instance_methods - Object.methods
(был "TestClass.methods - Object.methods" )
Вы можете получить более подробный список (например, структурированный путем определения класса) с такими драгоценными камнями, как debugging или 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
Возвращает массив, содержащий имена общедоступных и защищенных экземпляров в приемнике. Для модуля это общедоступные и защищенные методы; для класса они являются экземпляром (не Singleton). Если параметр необязателен, методы любые предки не включены. Я беру пример официальной документации.
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]