Edited at

Ruby 変数のスコープ

More than 3 years have passed since last update.


記事の概要

変数の種類、使用法、スコープについてまとめ。

キーワード => [インスタンス変数、クラス変数、グローバル変数]


Rubyにおける変数の種類


  • ローカル変数

  • インスタンス変数

  • クラス変数

  • グローバル変数

ほかに、疑似変数があるが本記事では省略。


ローカル変数

書き方:小文字または_ではじめる。

スコープ:(宣言した位置から)その変数が宣言されたブロック、メソッド定義、またはクラス/モジュール定義の終わりまで。つまり、オブジェクトの壁やメソッドの壁を超えては参照できず、それが定義された場所でしか通用しない、名前通り極めてローカルなもの。


sample.rb

code


試しに、内側から呼び出してみる。


sample.rb

class Harahe

my_feeling = "お腹へった!!"
def tabetai
puts my_feeling, "コンビニいこ" #tabetai内で定義されていないローカル変数を呼び出してみる
end
end

harahe = Harahe.new
harahe.tabetai #=>undefined local variable or method `my_feeling'


繰り返す。やはり、オブジェクトの壁やメソッドの壁を超えては参照できず、それが定義された場所でしか通用しない


インスタンス変数

書き方 : @を前置する

スコープ:クラス内で全メソッドで共通して使用することが出来る。クラスから作成されるオブジェクト毎に固有のもの。このようにインスタンスごとに独立してもつ変数だから、インスタンス変数という。


sample.rb

class Harahe

def initialize(feeling)
@feeling = feeling
end
def gaman
puts @feeling,"・・・けど我慢しよ"
end
end

harahe = Harahe.new("お腹減った")
harahe.gaman #=>お腹減った!・・・けど我慢しよ
haraherinu = Harahe.new("腹へりぬ")
haraherinu.gaman #=>腹へりぬ・・・けど我慢しよ


今度はローカル変数とは異なり、メソッドをまたいで共有されていることがわかった。そして、インスタンスごとに異なった値をもつことができるということも証明された。


クラス変数

書き方:@@を前置

スコープ:そのクラスおよびそこから生成されるオブジェクト(インスタンス)の中ならどこからでも参照可能。

:sample.rb

class Nemui
@@feeling = "眠すぎ"
def nemu
puts @@feeling
end
end

nemui = Nemui.new
nemui.nemu #=>眠すぎ


グローバル変数

書き方:$を前置

スコープ:メソッドどころか、オブジェクトの壁ものりこえて有効。


参考サイト