1
0

More than 1 year has passed since last update.

Rubyの特異メソッド、クラスメソッドを理解する

Last updated at Posted at 2021-10-01

Rubyのリファレンスを見るとよく特異メソッドという言葉が出てくるので調べました。
クラスメソッドとも関連があるため併せて記載します。

動作確認環境 ruby 3.0.0p0

特異メソッド

まずはリファレンスから。

特異メソッドとはクラスではなくある特定のオブジェクトに固有のメソッドです。特異メソッドの定義はネストできます。

クラスの特異メソッドはそのサブクラスにも継承されます。言い替えればクラスの特異メソッドは他のオブジェクト指向システムに>おけるクラスメソッドの働きをすることになります。

特異メソッド定義式は、メソッド名を Symbol にしたオブジェクトを返します。

Rubyはオブジェクトに対して固有のメソッドを定義できるみたいですね。
犬のしつけに例えてサンプルコードを試してみました。

class Dog
  def bark
    'わんわん'
  end
end

pochi = Dog.new
taro = Dog.new

# pochiにお手をしつけ
def pochi.ote
  'わん!(お手をする)'
end

# pochi
pochi.bark # => "わんわん"
pochi.ote # => "わん!(お手をする)"

# taro
taro.bark # => "わんわん"
taro.ote # => undefined method `ote` for #<Dog:0x00007fdb1fb2a730>
# お手してくれない。。

def pochi.oteのようにdef obj.method_nameと書くことで、objに対してメソッドを追加することができる。
このようにオブジェクト特有のメソッドを特異メソッドというみたいです。

クラスメソッド

Rubyのクラスメソッドは特異メソッドを応用しています。
クラスメソッドはself.method_nameという形式で書くことが多いと思います。

def User
  def self.adult_age
    20
  end
end

selfはクラス自身を指すので、Userに置き換えられます。

def User
  def User.adult_age
    20
  end
end

この形をみると、Userオブジェクトに特異メソッドが追加されたことになります。
「あれ、Userはオブジェクトではないのでは?」と疑問が浮かんで調べてところ、実はUserはClassクラスのオブジェクトになります。

User.class
=> Class

参考:プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus 8.5.7 クラスやモジュール自身もオブジェクト

つまり、クラスメソッドとして使っているself.method_nameの形式は自身のクラスの特異メソッドを定義していることになります。
これにより、Rubyはクラスメソッドを実現しているみたいです。

参考サイト

以下参考にさせていただきました。

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software Design plus
8.5.7 クラスやモジュール自身もオブジェクト

1
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
1
0