web-dev-qa-db-ja.com

継承されたメソッドなしでクラスのパブリックメソッドを取得するにはどうすればよいですか?

任意のオブジェクトが与えられると、#public_methodsを呼び出して、それが応答するすべてのメソッドを確認できます。ただし、継承されていないすべてのパブリックメソッド、つまり実際にこのクラスの一部であるもののクイックリストを取得すると便利な場合があります。

私は " Ruby object "のパブリックメソッドを一覧表示する簡単な方法)で見つけました。

(Foo.public_methods - Object.public_methods).sort

たくさんの基本的なRubyのものを除外できます。チェーン全体で継承されたものすべてをフィルタリングできるようにしたいです。親クラスがわかっている場合は、それですが、任意のオブジェクトの継承されていないパブリックメソッドの配列を返すことができる汎用コマンドを考え出したいのです。

36
Andrew

public_methodsfalse引数にinheritedを渡すだけです。

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

あなたの質問に対する答えではありませんが、あなたが知らなかった場合、irbはオートコンプリートを行うので、パブリックメソッドのリストを簡単に取得できます(特に探しているメソッドの始まりを知っている場合) 。タブを押すだけです。 2回押すと、すべての可能性が一覧表示されます(ただし、継承されたものも含まれます)。

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

pry を使用すると、継承のレベルごとに分類された、使用可能なメソッドをさらに簡単に確認できます。

[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_
60

Module#instance_methods を見てください。そのメソッドには1つのブール引数があります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]
10
Marshall Shen