LoginSignup
0
0

More than 3 years have passed since last update.

【Ruby】インスタンスメソッド・クラスメソッド・特異メソッドの違い

Posted at

インスタンスメソッド、クラスメソッド、特異メソッドの違いについてまとめてみました!!

インスタンスメソッドとは?

  • インスタンスから呼べるメソッドのこと

定義の仕方と解説

スクリーンショット 2020-03-28 11.14.25.png
Human.instance_methods.grep(/say_hello/)でメソッドがあることがわかるのでインスタンスメソッド

クラスメソッドとは?

  • クラスから呼べるメソッドのこと

定義の仕方と解説1

スクリーンショット 2020-03-28 11.26.42.png

定義の仕方と解説2

スクリーンショット 2020-03-28 11.29.37.png

クラスメソッドのselfはクラスそのものです。
厳密にいうとselfが書かれた場所に参照するレシーバを返します。
selfの代わりにクラス名をそのまま使ってもクラスメソッドになります。

Human.methods.grep(/say_hello/)でメソッドがあることがわかるのでクラスメソッド
Human.singleton_methods.grep(/say_hello/)でメソッドがあることがわかるので特異メソッド(シングルトンメソッド
上記の検証からクラスメソッドは特異メソッドであることがわかります。
 

 特異メソッド(シングルトンメソッド)とは?

  • 1つのオブジェクト固有のメソッド
  • クラスメソッドは特異メソッド

特異メソッドがオブジェクト固有のメソッドとは?

  • オブジェクト固有とはオブジェクトIDが同じということ
  • インスタンスのオブジェクトIDは一つ一つ違う

コードで説明

  • インスタンスのobject_idをみるとそれぞれ違う。クラス、モジュールは同じ
  • classメソッドはオブジェクトのクラスが確認できる
  • ancestorsメソッドは継承関係を確認できる
  • object_idは各オブジェクトに対して一意な整数を確認できる

class Human
end

p BasicObject.class
=> Class
p BasicObject.ancestors
=> [BasicObject]
p BasicObject.object_id
=> 580
p BasicObject.object_id
=> 580
BasicObjectはnewメソッドがなくインスタンス化できない
❌ p BasicObject.new.object_id
❌ p BasicObject.new.object_id

p Kernel.class
=> Module
p Kernel.ancestors
=> [Kernel]
p Kernel.object_id
=> 600
p Kernel.object_id
=> 600
Kernelはモジュールのためnewメソッドがなくインスタンス化できない
❌ p Kernel.new.object_id
❌ p Kernel.new.object_id

p Object.class
=> Class
p Object.ancestors
=> [Object, Kernel, BasicObject]
p Object.object_id
=> 60
p Object.object_id
=> 60
p Object.new.object_id
=> 620
p Object.new.object_id
=> 640
p Human.class
=> Class
p Human.ancestors
=> [Human, Object, Kernel, BasicObject]
p Human.object_id
=> 660
p Human.object_id
=> 660
p Human.new.object_id
=> 680
p Human.new.object_id
=> 700

参考

Ruby 2.7.0 リファレンスマニュアル

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0