next up previous contents
Next: 13 クラスの練習 Up: algorism_out Previous: 11 クラスとオブジェクトの概要

Subsections


12 クラスにおける変数

12.1 変数の種類

変数には ローカル変数、インスタンス変数、クラス変数、グローバル変数などがある。変 数名の書き方と、スレゾレノスコープは以下の様になる。 スコープとはそのへん数がどの範囲で有効であるかを示す。
変数 名前の付け方 スコープ
ローカル変数 小文字で始める abc, foo メソッド内で有効
インスタンス変数 @で始める @abc, @foo 呼び出したインスタンスの中で有効
クラス変数 @@で始める @@abc, @@foo クラスの中で有効。クラス が同じなら、
      インスタンスが異なっても有効
グローバル変数 $で始める $abc, $foo プログラム全体で有効
定数 大文字で始める Abc, Foo クラス変数と同じ


12.2 ローカル変数

ローカル変数とはメソッド定義の中だけに有効な変数のこと。 以下のプログラムを実行する。
------------ program ------------
n = 10
def var1(k)
  for n in 0..k do
    printf("for文中の n の値は %d \n",n)
  end
  printf("defの(forの外)の n の値は %d \n",n)
end
var1(5)
printf("defの外の n の値は %d \n",n)
------------ end ----------------
実行結果は、以下のとおり、。

$ ruby var_local1.rb
for文中の n の値は 0
for文中の n の値は 1
for文中の n の値は 2
for文中の n の値は 3
for文中の n の値は 4
for文中の n の値は 5
defの(forの外)の n の値は 5
defの外の n の値は 10
同じ ``n''でも位置によって異なる。 メソッドの外には影響を与えない。


12.3 インスタンス変数

インスタンス変数は、インスタンス間の変数は共通になるが、インスタンスが異なると別の変数として 扱われる。
------------ program ------------
class Variable
 def var_1
   a = 10
   @b = a + 10
   printf(" var_1 の中の a = %d \n", a)
 end
  
 def var_2
   a = 20
   printf(" var_2 の中の a = %d \n", a )
   printf(" var_2 の中の @b = %d \n", @b)  
 end
end

c1 = Variable.new     # c1を"Variable" クラスとして定義。
                      # これにより"c1"インスタンスが生成される。
c2 = Variable.new     # c2を"Variable" クラスとして定義。
                      # これにより"c2"インスタンスが生成される。
c1.var_1              # "c1" インスタンスの "var_1" が実行される。
c1.var_2              # "c1" インスタンスの "var_2" が実行される。
c2.var_2              # "c2" インスタンスの "var_2" が実行される。
------------ end ----------------
実行結果は、以下のとおり。

$ ruby var_instans1.rb
 var_1 の中の a = 10
 var_2 の中の a = 20
 var_2 の中の @b = 20
 var_2 の中の a = 20
 var_2 の中の @b = 0
c1もc2も同じクラスに属しているが、インスタンスは異なる。 すなわち ``c1''の中で使われているインスタンス変数は ``c1''の中で全て同じ 変数として扱われる。 となる。 同様に ``c2''の中で使われているインスタンス変数は ``c2'' の中で 同じ変数として扱われることとなる。


12.4 クラス変数

クラス変数はクラスが同じであれば、ひとつの変数として扱われる。
------------ program ------------
class Variable
 def var_1
   a = 10
   @@b = a + 10                               # 前とはこの部分が異なる。  
   printf(" var_1 の中の a = %d \n", a)
 end
  
 def var_2
   a = 20
   printf(" var_2 の中の a = %d \n", a )
   printf(" var_2 の中の @@b = %d \n", @@b)   # 前とはこの部分が異なる。  
 end
end

c1 = Variable.new     # c1を"Variable" クラスとして定義。
                      # これにより"c1"インスタンスが生成される。
c2 = Variable.new     # c2を"Variable" クラスとして定義。
                      # これにより"c2"インスタンスが生成される。
c1.var_1              # "c1" インスタンスの "var_1" が実行される。
c1.var_2              # "c1" インスタンスの "var_2" が実行される。
c2.var_2              # "c2" インスタンスの "var_2" が実行される。
------------ end ----------------
実行結果は、以下のとおり。
$ ruby var_class1.rb
 var_1 の中の a = 10
 var_2 の中の a = 20
 var_2 の中の @@b = 20
 var_2 の中の a = 20
 var_2 の中の @@b = 20
最後の値が異なる。 ``c1.var_1'' で、クラス変数が変化したので、異なるインスタンスである ``c2.var_2''の変数も変化したからである。

12.5 グローバル変数

グローバル変数は、プログラムの全て部分で同じ変数として扱われる。プログラム 中で値が変化していくとき、それが全体に影響を及ぼす。できれば使用を避けた 方が良い。




平成22年12月28日