メソッド
- インスタンスメソッド:クラスのインスタンスをレシーバとして呼び出すメソッド
- クラスメソッド:クラスの特異メソッド (クラスをレシーバとして呼び出すメソッド)
- 関数的メソッド:レシーバを指定しない呼び出し形式
- モジュールメソッド:モジュールの特異メソッド (→
module_function
) - 特異メソッド:特異クラスのインスタンスメソッド (→
singleton_class
/singleton_methods
) - プライベートメソッド:レシーバを指定して呼び出せないメソッド (インスタンス外から関数的メソッド呼び出しができない /
send
経由で呼び出せるので完全な隠蔽はできない)
参考:
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)
メソッドを定義する (def)
参考:
メソッドの定義と呼び出し | Ruby 入門 (javadrive.jp)
エンドレスメソッド定義
参考:
Ruby の開発版に右代入演算子とエンドレスメソッド定義構文が入った – Qiita
Ruby 開発版に右代入演算子と end なしメソッド定義が入った | @znz blog
インスタンスメソッド/クラスメソッド
参考:
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 でアプリを作る
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
In Ruby what does the “receiver” refer to? – Stack Overflow
send / __send__
メソッド名と引数を与えてメソッドを呼び出し、メソッドの実行結果を返す。
result = obj.(method_name, *args)
__send__
は send
のエイリアス。send
をオーバーライドして別の関数とした場合に用いる。
参考:
Method#call と Object#send | うなの日記
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
参考:
instance method Object#method (Ruby 2.6.0)
instance method Method#=== (Ruby 2.6.0)
instance method Method#unbind (Ruby 2.6.0)
UnboundMethod
参考:
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)
組み込みメソッド
参考:
method_defined?
参考: