【Ruby v2.6】インスタンスメソッド その1(基本的なこと)
前置き
Ruby のインスタンスメソッドについてまとめます。 その1は、基本的なこと。
書き方
クラス定義内で、def
の後にメソッド名を書き、機能の記述をend
ではさむことで定義できます。
インスタンスメソッドのサンプル
以下、サンプルのクラスです。
class A # アクセサの定義:getter, setter インスタンスメソッドを定義する。 attr_accessor :instanceval_a @@classval_a = "クラス変数 @@classval_a" @classinstanceval_a = "クラスインスタンス変数 @classinstanceval_a" # 生成したオブジェクトを初期化するインスタンスメソッド initialize # クラスメソッド A.new から呼び出されるプライベートメソッド def initialize @instanceval_a = "インスタンス変数 @instanceval_a" p "called initialize." end # 通常のインスタンスメソッド a_method def a_method # 各変数へのアクセス確認 p @@classval_a p @classinstanceval_a # クラスインスタンス変数は参照できない。 p @instanceval_a "called a_method." end end
irb でクラスを読み込んで、確認してみます。
まず、クラスのインスタンスメソッドを確認してみます。組み込みの.instance_methods
メソッドで確認できます。引数にfalse
を指定すると、継承されたメソッド以外のものだけを表示できます。
A.instance_methods(false) # => [:a_method, :instanceval_a=, :instanceval_a]
instanceval_a=
とinstanceval_a
は、attr_accessor で自動作成したsetter, getter メソッドです。
initialize
メソッドは「プライベート」なメソッドなので、ここでは表示されません。
続いて、インスタンスを生成し、a_method
を呼び出してみます。
obj = A.new # => "called initialize." obj.a_method # => "クラス変数 @@classval_a" nil "インスタンス変数 @instanceval_a" => "called a_method."
インスタンスメソッド内からは、クラス変数、インスタンス変数は参照できますが、クラスインスタンス変数は参照できないことが分かります(nil が返ってくる)。これは、クラスインスタンス変数は、「クラスオブジェクト自身が持つインスタンス変数」であって、「クラスのインスタンスオブジェクトが持つインスタンス変数」ではないからです。
その1のまとめ
- インスタンスメソッドは、クラス定義内で
def メソッド名
で定義する。 - インスタンスメソッドは、クラスから
.new
メソッドでインスタンスを生成後、[インスタンス].[メソッド名]で呼び出す。 - インスタンスメソッド内では、クラス変数とインスタンス変数は参照できるが、クラスインスタンス変数は参照できない。
その2に続きます。