ぎょーぼのぶろぐ

IT系の話を書いていくブログです。今はRubyの勉強中。

【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のまとめ

その2に続きます。