メソッド

  • インスタンスメソッド:クラスのインスタンスをレシーバとして呼び出すメソッド
  • クラスメソッド:クラスの特異メソッド (クラスをレシーバとして呼び出すメソッド)
  • 関数的メソッド:レシーバを指定しない呼び出し形式
  • モジュールメソッド:モジュールの特異メソッド (→ module_function)
  • 特異メソッド:特異クラスのインスタンスメソッド (→ singleton_class / singleton_methods)
  • プライベートメソッド:レシーバを指定して呼び出せないメソッド (インスタンス外から関数的メソッド呼び出しができない / send 経由で呼び出せるので完全な隠蔽はできない)

参考:

特異クラス・特異メソッド・メソッドの種類 – Qiita

メソッドの種類 | ざっくりん雑記

関数的メソッドを作ってみよう – Qiita

Ruby のメソッドについて – Qiita

Ruby で使えるメソッドの一覧を取得する – Qiita

instance method Module#module_function (Ruby 2.6.0)

instance method Object#singleton_class (Ruby 2.6.0)

instance method Object#singleton_methods (Ruby 2.6.0)

インスタンスメソッド/クラスメソッド

参考:

Ruby のクラスメソッドとインスタンスメソッドの例 – Qiita

クラスメソッドをインスタンスメソッドから呼び出す | KeruuWeb

クラスメソッドとインスタンスメソッドについてザクッと分かりやすく説明してみる – Qiita

Calling class method from instance – Stack Overflow

特異メソッド

特異クラスのインスタンスメソッド。

クラスメソッドの一覧を確認する。

p obj.class.singleton_class.instance_methods(false)

もしくは、

p obj.class.singleton_methods(false)

参考:

オブジェクトにメソッドを追加する特異メソッド | 集中力なら売り切れたよ

Ruby での動的なクラスメソッドの追加方法 | Java エンジニア、Ruby on Rails でアプリを作る

extend (Object) – Rubyリファレンス

instance method Object#singleton_class (Ruby 2.6.0)

instance method Object#singleton_methods (Ruby 2.6.0)

instance method Module#instance_methods (Ruby 2.6.0)

レシーバー

参考:

Ruby のレシーバを省略した場合はレシーバが self になることについて – Qiita

ruby のレシーバとは – Qiita

レシーバについて | teratail

In Ruby what does the “receiver” refer to? – Stack Overflow

send / __send__

メソッド名と引数を与えてメソッドを呼び出し、メソッドの実行結果を返す。

result = obj.(method_name, *args)

__send__send のエイリアス。send をオーバーライドして別の関数とした場合に用いる。

参考:

Method#call と Object#send | うなの日記

send (Object) – Rubyリファレンス

instance method Object#__send__ (Ruby 2.5.0)

methods

参考:

instance method Object#methods (Ruby 2.5.0)

メソッドを探す

インスタンスメソッドを grep する。

"hello".methods.grep /to_/

クラスメソッドの一覧を表示する。Object のクラスメソッドを除く。

String.methods - Object.methods

オブジェクトのインスタンスメソッドの一覧を表示する。Object のインスタンスメソッドを除く。

"hello".methods - Object.instance_methods

クラスで定義されているインスタンスメソッドの一覧を表示する。上位クラスのインスタンスメソッドを除く。

String.instance_methods(false)

参考:

Finding a method name on a Ruby object | makandra dev

定義されている場所を調べる

参考:

メソッドが定義された場所を調べる | 自由なブログだよ (hoshinotsuyoshi.com)

メソッドオブジェクト

Method

参考:

class Method (Ruby 2.6.0)

instance method Object#method (Ruby 2.6.0)

instance method Method#=== (Ruby 2.6.0)

instance method Method#unbind (Ruby 2.6.0)

UnboundMethod

参考:

UnboundMethod で遊んでみた – Qiita

class UnboundMethod (Ruby 2.6.0)

instance method Module#instance_method (Ruby 2.6.0)

instance method UnboundMethod#bind (Ruby 2.6.0)

Is it possible to force bind to instances of other classes? – Stack Overflow

メソッド名を取得する

Method を拡張して full_name を定義する。

Method.class_eval do
  def full_name
    "#{receiver.class.name}\##{name}"
  end
end

インスタンスメソッド内から method(__method__) に対して full_name を取得する。

class A
  def my_method
    method(__method__).full_name
  end
end

A.new.my_method #=> "A#my_method"

参考:

メソッドの中からクラス名とメソッド名を取得する – Qiita

instance method Object#method (Ruby 2.6.0)

module function Kernel.#__method__ (Ruby 2.6.0)

instance method Method#name (Ruby 2.6.0)

instance method Method#receiver (Ruby 2.6.0)

instance method Object#class (Ruby 2.6.0)

instance method Module#inspect (Ruby 2.6.0)

module function Kernel.#__callee__ (Ruby 2.6.0)

Get the name of the currently executing method – Stack Overflow

receiver

参考:

instance method Method#receiver (Ruby 2.6.0)

組み込みメソッド

参考:

あれもこれも、Ruby ではメソッド。 – Qiita

method_defined?

参考:

instance method Module#method_defined? (Ruby 2.6.0)

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です