获取类的实例方法的列表


Answers:


114

您实际上想要的是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"]

3
嘿,你把我击败了47秒。+1
Phrogz 2011年

2
当我尝试时print TestClass.new.instance_methods,出现此错误my_class.rb:10:in <main>: undefined method instance_methods for #<TestClass:0x96b9d20> (NoMethodError)
Vladimir Tsukanov 2011年

您只需要做TestClass.new.methods。也许“它”在我的回答中模棱两可。
安德鲁·格林

请注意,在Ruby 1.9+中,方法名称数组是符号,而不是字符串。
Phrogz 2011年

1
@Phrogz:是的,但是您可以在它们上使用正则表达式。你甚至都不召唤克苏鲁!:)虽然您会得到[:method1]代替。
安德鲁·格林

113
TestClass.methods(false) 

仅获取仅属于该类的方法。

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


2
这是测试类是否具有来自伪接口/抽象基类的多态方法的好方法,而无需尝试直接调用方法。
Daniel Doezema

2
接受的答案很好,但这可能是更多人来这里的原因!
亚伦

这绝对应该是公认的答案。谢谢!
Vinicius Brasil

38
TestClass.instance_methods

或没有所有继承的方法

TestClass.instance_methods - Object.methods

(以前是“ TestClass.methods-Object.methods”)


25
或没有继承的方法:TestClass.methods(false)
sawa

2
@sawa TestClass.methods(false)返回空
Vladimir Tsukanov 2011年

1
这个答案是错误的。结果将不包括method1method2method3,因为它们是类实例的方法,而不是TestClass对象本身的方法。
Phrogz 2011年

1
@Phrogz:糟糕……是的,“ TestClass.instance_methods-Object.methods”或“ TestClass.new.methods-Object.methods” ...它们会教我不要启动控制台。对我来说最好是删除或编辑此答案?
6

1
@Pavling绝对编辑正确的答案。(很快,在OP将功劳分配给其他人之前!:)
Phrogz 2011年


6
$ 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

2
这与其他答案过于相似,并且未添加任何其他信息或说明。
2014年

3
您淡忘了这也很晚。:D
道格拉斯·艾伦

2

根据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]

0

要仅获取自己的方法,并排除继承的方法:

从实例内部:

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]

(使用ruby 2.6.x)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.