0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[ Ruby ]クラスメソッド、インスタンスメソッドなど

Last updated at Posted at 2020-10-14

はじめに

前回は、クラスの継承やネストなどの記事を書きましたが、
今回はクラスメソッドなどの基礎知識を書いていきます。

メソッド

クラスメソッド

その名の通り、クラスオブジェクトが呼び出せるメソッドです。

インスタンスオブジェクトでは呼ぶことが出来ません。
そのため、よく対比されるものとして、インスタンスメソッドがありますが
これについては後述します。

定義の仕方として以下の方法があります。

メソッドを定義する際にメソッド名の前に self. を付ける

メソッド内で自身のクラスをレシーバとする際は、クラス名self
省略することが出来ますが、定義の際のselfは省略できません。

class Klass
  def self.method_a
    new
    puts "created Klass instance"
  end
end

Klass.method_a
# => created Klass instance
class << self, end で囲む

この間に定義されたものは、全てクラスメソッドとなるため
複数定義する際に便利です。

class Klass
  class << self
    def method_a
      new
      puts "created Klass instance"
    end
  end
end

Klass.method_a
# => created Klass instance

ちなみに、これに近い形でこのようにも出来ます。

class Klass
end

class << Klass
  def method_a
    new
    puts "created Klass instance"
  end
end

Klass.method_a
# => created Klass instance

インスタンスメソッド

インスタンスオブジェクトが呼び出せるメソッドです。
こちらは、先ほどのクラスメソッドとは対象に
クラスオブジェクトからは呼び出すことができません。

定義の方法は以下です。

class Klass
  def method_a
    puts "method_a called"
  end
  
  def method_b
    method_a
    puts "method_b called"
  end
end

klass_instance = Klass.new
klass_instance.method_b
# => method_a called
# => method_b called

特異メソッド

オブジェクト固有のメソッドのことです。
定義するメソッド名の前に、オブジェクト名を書くことで定義できます。
なお、定義する際に、そのオブジェクトが既に存在していないといけません。

class Klass
end

apple = Klass.new
orenge = Klass.new

def apple.tokui_method
  puts "I'm apple"
end

apple.tokui_method
# => I'm apple
orenge.tokui_method
# => undefined method `tokui_method'

もしも定義する際にその指定するオブジェクトが存在していなかった場合、エラーとなります。

class Klass
end

def apple.tokui_method
  puts "I'm apple"
end

apple = Klass.new

apple.tokui_method
# => undefined local variable or method `apple' for main:Object (NameError)

特異メソッド内でsuperを呼ぶと、クラスに定義されている同名のメソッドが呼ばれます。
また、そのメソッドのオーバーライドが出来るという便利な点もあります。

class Klass
  def my_name
    puts "I'm fruits"
  end
end

apple = Klass.new
orenge = Klass.new

def apple.my_name
  super
  puts "I'm apple"
end

apple.my_name
# => I'm fruits
# => I'm apple
orenge.my_name
# => I'm fruits

おわり

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?