获取类的实例方法列表

Vla*_*nov 92 ruby reflection ruby-1.9.2

我有一节课:

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end
Run Code Online (Sandbox Code Playgroud)

我怎样才能在这个类的我的方法列表(method1,method2,method3)?

And*_*imm 109

你真的想要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"]
Run Code Online (Sandbox Code Playgroud)

或者你可以调用methods(而不是instance_methods)对象:

test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]
Run Code Online (Sandbox Code Playgroud)

  • 嘿,你用47秒击败了我.+1 (2认同)
  • 当我尝试`print TestClass.new.instance_methods`时,我得到这个错误`my_class.rb:10:在<main>中:未定义的方法instance_methods for#<TestClass:0x96b9d20>(NoMethodError) (2认同)

Bij*_*jan 107

TestClass.methods(false) 
Run Code Online (Sandbox Code Playgroud)

仅获取属于该类的方法.

TestClass.instance_methods(false) 将返回给定示例中的方法(因为它们是TestClass的实例方法).

  • 这是测试一个类是否具有伪接口/抽象基类的多态方法而不必尝试直接调用方法的好方法. (2认同)
  • 接受的答案很棒但是这个很可能会有更多的人来这里! (2认同)

Pav*_*ing 36

TestClass.instance_methods
Run Code Online (Sandbox Code Playgroud)

或者没有所有继承的方法

TestClass.instance_methods - Object.methods
Run Code Online (Sandbox Code Playgroud)

(是'TestClass.methods - Object.methods')

  • 或没有继承的方法:`TestClass.methods(false)`. (23认同)
  • @sawa`TestClass.methods(false)`返回空 (2认同)

J-_*_*_-L 6

您可以使用诸如调试外观之类的宝石获得更详细的列表(例如,通过定义类来构建).


Dou*_*len 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
Run Code Online (Sandbox Code Playgroud)

  • 你不好意思提到它也很晚.:d (3认同)
  • 这与其他答案太相似,并没有添加其他信息或清晰度. (2认同)

Muk*_*pta 5

根据 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
Run Code Online (Sandbox Code Playgroud)

让我们看看输出。

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]
Run Code Online (Sandbox Code Playgroud)