105

我有一堂课:

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

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

4

7 回答 7

124

您实际上想要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(not instance_methods):

test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]
于 2011-06-24T13:59:16.050 回答
123
TestClass.methods(false) 

仅获取属于该类的方法。

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

于 2013-03-09T00:24:17.993 回答
40
TestClass.instance_methods

或没有所有继承的方法

TestClass.instance_methods - Object.methods

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

于 2011-06-24T13:18:36.937 回答
7
$ 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
于 2014-09-08T00:46:34.173 回答
5

您可以获得更详细的列表(例如通过定义类来构建),其中包含诸如debuglooksee 之类的宝石。

于 2011-06-24T13:56:05.777 回答
3

根据 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]
于 2017-06-06T13:19:23.550 回答
1

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

从实例内部:

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)

于 2020-04-23T02:47:32.910 回答