获取类的实例方法列表

问题描述 投票:0回答:9

我有课:

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

如何获取此类中的方法列表(

method1
method2
method3
)?

ruby reflection ruby-1.9.2
9个回答
131
投票
TestClass.methods(false) 

仅获取属于该类的方法。

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


126
投票

您实际上想要

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"]

42
投票
TestClass.instance_methods

或者没有所有继承的方法

TestClass.instance_methods - Object.methods

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


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

5
投票

您可以使用 debugginglooksee 等宝石获得更详细的列表(例如通过定义类构建)。


5
投票

根据 Ruby 文档 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]

2
投票

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

从实例内部:

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)


0
投票

如果您有实例但不知道类名:

object.class.instance_methods(false)
# => Array of class instance methods

0
投票

类方法

使用 Object#methods(regular=true) : 列出没有继承方法的 class

方法

返回 obj 的公共方法和受保护方法的名称列表。这将包括 obj 祖先中可访问的所有方法。如果可选参数为 false,则返回 obj 的公共和受保护单例方法的数组,该数组将不包含 obj 包含的模块中的方法。

TestClass.methods(false)

实例方法

使用 Module#instance_methods(include_super=true): 列出没有继承方法的 instance

方法

返回一个数组,其中包含接收者中公共和受保护实例方法的名称。对于模块来说,这些是公共方法和受保护方法;对于类来说,它们是实例(而不是单例)方法。如果可选参数为 false,则不包含任何祖先的方法。

TestClass.instance_methods(false)

过滤

默认情况下,会返回所有类型的方法,但是如果您只想要公共方法怎么办?有专门的变体:

© www.soinside.com 2019 - 2024. All rights reserved.