给定任何对象我可以调用#public_methods
并查看它将响应的所有方法。但是,我发现有时候可以方便地获得所有未继承的公共方法的快速列表,即那些真正属于这个类的东西。
我在“Easy way to list public methods for a Ruby object”中发现,如果我使用:
(Foo.public_methods - Object.public_methods).sort
我可以过滤掉很多基本的Ruby东西。我希望能够过滤掉链条上一直延续的所有内容。如果我知道父类我可以使用它进行过滤,但我想提出一个通用命令,它可以返回任何对象的未公开公共方法的数组。
答案 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]