ruby 获取类的示例方法列表

avwztpqn  于 2022-11-04  发布在  Ruby
关注(0)|答案(8)|浏览(164)

我上课:

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

如何获得该类(method1method2method3)中的方法列表?

6rqinv9w

6rqinv9w1#

TestClass.methods(false)

以仅获取只属于该类的方法。
TestClass.instance_methods(false)将返回给定示例中的方法(因为它们是TestClass的示例方法)。

6ovsh4lw

6ovsh4lw2#

实际上,您需要的是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"]
0g0grzrc

0g0grzrc3#

TestClass.instance_methods

或者不使用所有继承的方法

TestClass.instance_methods - Object.methods

(Was“测试类.方法-对象.方法”)

b91juud3

b91juud34#

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

nxowjjhe5#

你可以通过调试或looksee这样的gem得到一个更详细的列表(例如,通过定义类来构造)。

du7egjpx

du7egjpx6#

显示Ruby文档示例_方法
返回一个数组,该数组包含接收器中的公共和受保护的示例方法的名称。对于模块,这些是公共和受保护的方法。对于一个类来说,它们是示例(而不是单例)方法。2如果可选参数为false,则不包括任何祖先的方法。3我用的是官方文档中的例子。

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

puruo6ea7#

若要只取得自己的方法,并排除继承的方法:
在示例中:

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]

(with Ruby 2.6.x)

gv8xihay

gv8xihay8#

如果您有一个示例但不知道类名:

object.class.instance_methods(false)

# => Array of class instance methods

相关问题