如何在没有继承方法的情况下获取类的公共方法?

时间:2012-01-13 03:59:04

标签: ruby introspection public-method

给定任何对象我可以调用#public_methods并查看它将响应的所有方法。但是,我发现有时候可以方便地获得所有未继承的公共方法的快速列表,即那些真正属于这个类的东西。

我在“Easy way to list public methods for a Ruby object”中发现,如果我使用:

(Foo.public_methods - Object.public_methods).sort

我可以过滤掉很多基本的Ruby东西。我希望能够过滤掉链条上一直延续的所有内容。如果我知道父类我可以使用它进行过滤,但我想提出一个通用命令,它可以返回任何对象的未公开公共方法的数组。

2 个答案:

答案 0 :(得分:54)

只需传递false inherited的{​​{1}}参数:

public_methods

不是你问题的答案,但如果你不知道,"hello".public_methods.include?(:dup) # => true "hello".public_methods(false).include?(:dup) # => false 会自动完成,所以很容易得到公共方法的列表(特别是如果你知道你正在寻找的方法的开头)对于)。只需点击标签;两次击中将列出所有可能性(包括继承的可能性):

irb

使用pry可以更容易地看到可用的方法,按继承级别细分:

> "nice".d<tab><tab>
"nice".delete      "nice".delete!    "nice".display   "nice".downcase                 
"nice".downcase!   "nice".dump       "nice".dup       "nice".define_singleton_method

> "nice".<tab><tab>
Display all 162 possibilities? (y or n)
...

答案 1 :(得分:8)

看看Module#instance_methods。该方法有一个布尔参数include_super是否也返回继承的方法。默认值为true。

您可以使用以下内容:

class A 
  def method_1
     puts "method from A"
  end
end

class B < A
  def method_2
    puts "method from B"
  end
end

B.instance_methods        # => [:method_1, :method_2, ...]
B.instance_methods(false) # => [:method_2]