43

给定我可以调用的任何对象#public_methods并查看它将响应的所有方法。但是,我发现有时快速列出所有未继承的公共方法(即真正属于此类的内容)的列表会很方便。

我在“列出 Ruby 对象的公共方法的简单方法”中发现,如果我使用:

(Foo.public_methods - Object.public_methods).sort

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

4

2 回答 2

72

只需传递falseinherited论点public_methods

"hello".public_methods.include?(:dup) # => true
"hello".public_methods(false).include?(:dup) # => false

不是你的问题的答案,但如果你不知道,irb自动完成,所以很容易获得公共方法的列表(特别是如果你知道你正在寻找的方法的开头)。只需点击标签;点击两次将列出所有可能性(但包括继承的可能性):

> "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)
...

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

[1] pry(main)> cd "nice"
[2] pry("nice"):1> ls
Comparable#methods: <  <=  >  >=  between?
String#methods: %  *  +  <<  <=>  ==  ===  =~  []  []=  ascii_only?  bytes  bytesize  byteslice  capitalize  capitalize!  casecmp  center  chars  chomp  chomp!  chop  chop!  chr  clear  codepoints  concat  count  crypt  delete  delete!  downcase  downcase!  dump  each_byte  each_char  each_codepoint  each_line  empty?  encode  encode!  encoding  end_with?  eql?  force_encoding  getbyte  gsub  gsub!  hash  hex  include?  index  insert  inspect  intern  length  lines  ljust  lstrip  lstrip!  match  next  next!  oct  ord  partition  prepend  replace  reverse  reverse!  rindex  rjust  rpartition  rstrip  rstrip!  scan  setbyte  shellescape  shellsplit  size  slice  slice!  split  squeeze  squeeze!  start_with?  strip  strip!  sub  sub!  succ  succ!  sum  swapcase  swapcase!  to_c  to_f  to_i  to_r  to_s  to_str  to_sym  tr  tr!  tr_s  tr_s!  unpack  upcase  upcase!  upto  valid_encoding?
locals: _  _dir_  _ex_  _file_  _in_  _out_  _pry_
于 2012-01-13T04:02:15.070 回答
14

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

您可以使用以下内容:

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]
于 2014-01-08T18:04:52.677 回答