rubyオブジェクト指向(7)変数

本来、変数はプログラミング言語の学習の最初の段階でやるのが常ですが、私は経験上、変数スコープという変数の有効範囲の考えがちゃんと理解できるようになるためにはメソッドやクラスの概念がある程度理解できるようになってからのほうがいいと思っています。
ですので、あえて変数は最後の章に持ってきました。

変数には大きく分けて、グローバル変数、インスタンス変数、クラス変数、ローカル変数の4つがあります。各々は、変数名にプレフィックス(先頭に記号を付けること)を付与することで、その有効範囲(スコープといいます)が決まります。

★グローバル変数
グローバル変数は$で始まります。グローバル変数はプログラムのどこからでも参照できます。グローバル変数へ代入(宣言)せずにいきなり使っても、エラーが発生することはなく、nilが入っているものとみなされ使えます。
グローバル変数の多用は、コードを汚くします。どこの処理からでもどのグローバル変数も書き換え、参照できるので、今どんな値か、誰がなんのためにこの値を入れているか、分かりにくくなりがちです。注意が必要です。

irb> $foo
nil
irb> $foo = 5
5
irb> $foo
5

★インスタンス変数
インスタンス変数は@1つで始まります。これもまた、宣言前でもnilとしてアクセス可能です。
インスタンス変数はインスタンスごとに独立して持つ変数です。例えば継承した親子関係にあるクラスのインスタンス間で異なる値になります。
インスタンス変数にアクセスできるのは、initializeメソッドとオブジェクトのインスタンスメソッドだけです。initializeメソッドで初期化されて、その後、インスタンスメソッドから参照・変更される使い方が多いです。

インスタンス変数の使い方は次の通りです。

class Foo
  # イニシャライザで初期化 
  def initialize
    @var = 300
    puts "initialize:#{@var}" 
  end
  # インスタンスメソッドからアクセス 
  def hoge
    puts "hoge1:#{@var}" 
    @var += 1
    puts "hoge2:#{@var}" 
  end
end

# Fooのインスタンス化
irb> f = Foo.new
initialize:300
irb> f.hoge
hoge1:300
hoge2:301
# Fooのインスタンス化
irb> h = Foo.new
initialize:300
irb> h.hoge
hoge1:300
hoge2:301

fとhのインスタンス変数で、クラスFooがそれぞれ別のオブジェクトとして管理されていますので、hogeメソッドの中のインスタンス変数は別々の値を取り得ます。インスタンスがスコープになります。

★クラス変数
クラス変数は@@で始まります。これは宣言前のクラス変数へのアクセスはエラーを起こします。
そのクラスの全てのインスタンスで共有される変数になりますので、継承した親子関係にあるクラスのインスタンス間でも同じ値になります。

クラス変数はクラスメソッド、インスタンスメソッド、それぞれで参照、変更可能です。 
例えば、

class Foo2 
  @@var = 0
  def hoge 
    @@var += 1 
    puts "hoge:#{@@var}"
  end
  def self.hogehoge 
    @@var += 1 
    puts "hogehoge:#{@@var}"
  end 
end

irb> f = Foo2.new
irb> f.hoge
hoge:1
irb> f.hoge
hoge:2
irb> h = Foo2.new
irb> h.hoge
hoge:3
irb> Foo2.hogehoge
hogehoge:4

クラス変数は、定数に似ていますが、扱いは変更可能な値です。クラスとそのインスタンスがスコープになります。

★ローカル変数
ローカル変数は小文字のアルファベットか、アンダースコア(_)で始まる名称とします。上記の変数と違って、ローカル変数は必ず代入によって初期化される必要があります。メソッドがスコープです。

以上、4つの変数たち(グローバル変数、インスタンス変数、クラス変数、ローカル変数)を、自分で自在に使い分け、好きなように扱うことができれば一人前のプログラマーになった、と言ってもいいと思います。

この記事が気に入ったらサポートをしてみませんか?