Подтвердить что ты не робот

Получить список методов экземпляра класса

У меня есть класс:

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

Как я могу получить список моих методов в этом классе (method1, method2, method3)?

4b9b3361

Ответ 1

На самом деле вы хотите 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"]

Ответ 2

TestClass.methods(false) 

чтобы получить только те методы, которые принадлежат только этому классу.

TestClass.instance_methods(false) вернет методы из вашего данного примера (поскольку они являются экземплярами метода TestClass).

Ответ 3

TestClass.instance_methods

или без всех унаследованных методов

TestClass.instance_methods - Object.methods

(был "TestClass.methods - Object.methods" )

Ответ 4

Вы можете получить более подробный список (например, структурированный путем определения класса) с такими драгоценными камнями, как debugging или looksee.

Ответ 5

$ 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

Ответ 6

Согласно 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]