はじめに
前回は、クラスの継承やネストなどの記事を書きましたが、
今回はクラスメソッドなどの基礎知識を書いていきます。
メソッド
クラスメソッド
その名の通り、クラスオブジェクトが呼び出せるメソッドです。
インスタンスオブジェクトでは呼ぶことが出来ません。
そのため、よく対比されるものとして、インスタンスメソッドがありますが
これについては後述します。
定義の仕方として以下の方法があります。
メソッドを定義する際にメソッド名の前に 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