クリアメモリ

プログラミングやモーショングラフィックス、便利なアプリケーションなど雑多に記録するブログ

【Ruby】インスタンス変数 クラス変数の書き方と変数の種類

f:id:clrmemory:20170422184817p:plain 

Rubyで使われる変数の中に「ローカル変数」「グローバル変数」「インスタンス変数」「クラス変数」があります。

これらを備忘録としてメモ。

 

 

はじめに

 

この記事は筆者の、Ruby勉強時のメモ的な役割になっております。

一部間違っている可能性や理解が乏しい箇所もあるため、注意してください。

 

ローカル変数

 

ローカル変数は、言ってしまえば「普通の変数」です。

例えば、メソッド内で作成した「a」という変数は、別のメソッドから値を変更できない「ローカル(地方的)」な変数になる。

 

ローカル変数の書き方は「a」になる。

その他の変数は、頭に語を付属する必要があるのでそれぞれ確認してください。

 

グローバル変数

 

ローカル変数に対して、グローバルな変数という意味を持つ。

グローバル( 世界規模 )とあるように、ローカル変数とは違い「プログラム内」のどこからでも値を変化させることができる。

 

グローバル変数の書き方は「$a」となる。

ローカル変数を基準として捉えるのであれば「$」を先頭に付属するという書き方が正しいと思います。

 

ただし前述の通り、グローバル変数はプログラム内のどこからでも値の変更ができてしまう為め、意図しない時に変数名が被ってしまうことがある。そのため管理が難しく、多人数開発には向かない。

 

インスタンス変数

 

インスタンス内で値を変化できる変数。

書き方は、頭に「@」をつけて「@a」のように定義する。

 

ローカル変数と似ているが、インスタンス変数の場合、インスタンスごとに値を設定することができる。詳しくは以下参照。

※規約に対する名前のつけ方は適当。

 

class ABC
    def set_text(str)
        @instance_hensuu = str
        local_hensuu = str
    end

    def puts_text
        puts ">#{@instance_hensuu}"
        # puts ">#{local_hensuu}" <- エラー
    end
end

instance1 = ABC.new()
instance1.set_text("instance1")

instance2 = ABC.new()
instance2.set_text("instance2")

instance1.puts_text()
instance2.puts_text()

# => >instance1
# => >instance2

 

結果はローカル変数「local_hensuu」はエラーを吐き、instance1とinstance2では「それぞれ別の値を追加」できた。(instance1.puts_text()には引数がないため省略可)

ちなみに、インスタンス変数は「クラスメソッド」からの呼び出しはできない。

 

class ABC
    def set_text(str)
        @instance_hensuu = str
        # local_hensuu = str
    end

    def puts_text
        puts ">#{@instance_hensuu}"
        # puts ">#{local_hensuu}"
    end

    def self.class_method
        p @instance_hensuu
    end
end

instance1 = ABC.new()
instance1.set_text("instance1")

instance2 = ABC.new()
instance2.set_text("instance2")

instance1.puts_text
instance2.puts_text
ABC.class_method

# >instance1
# >instance2
# nil

 

クラス変数

 

インスタンス変数を元に考えると、クラス変数は「クラス内で共有できる」変数になる。

先ほどのコードでは、クラスメソッドを出力した時「nil」になってしまった。instance_hensuuをクラス変数にすることで、クラスメソッドからも値を変化できる。

 

インスタンス変数と似ているが「@@a」のように定義することで、クラス変数を作成できる。

 

先ほどのコードをそのまま使って、クラス変数の挙動を確認すると以下のようになった。

 

class ABC
    def set_text(str)
        # @instance_hensuu = str
        # local_hensuu = str
        @@class_hensuu = str
    end

    def puts_text
        # puts ">#{@instance_hensuu}"
        # puts ">#{local_hensuu}"
        puts ">#{@@class_hensuu}"
    end

    def self.class_method
        # p @instance_hensuu
        p @@class_hensuu
    end
end

instance1 = ABC.new()
instance1.set_text("instance1")

instance2 = ABC.new()
instance2.set_text("instance2")

instance1.puts_text
instance2.puts_text
ABC.class_method

# >instance1
# >instance2
# "instance2"

 

このように出力された。

 

まとめ

 

ローカル変数       -> 同一メソッド内で動作する局所的な変数。

グローバル変数    -> メソッドを越えて、プログラムのどこからでも動作する変数。

インスタンス変数 -> インスタンス内で動作する変数。

クラス変数           -> クラス内のどのインスタンスからでも動作する変数。

 

このほかにも、「クラスインスタンス変数」と呼ばれる、クラス内のオブジェクトのインスタンス変数や、擬似変数と呼ばれるものもあるが、それについてはまたの機会に。