クラス変数とクラスインスタンス変数とインスタンス変数の違いについて
Ruby Way 第2版を読んでいきなりつまづく。
P46
class Myclass @x = 1 # クラスインスタンス変数 @y = 2 # 別のクラスインスタンス変数 def mymethod @x = 3 # インスタンス変数 # ここで@yにアクセスすることはできない end end
これのなにが分からなかったかというと、クラスのはじめの@xとメソッド内の@xが別物であるということ(コメントに書いてあるんだけどね)。5年間C++を学んできた自分としては変数の宣言があることは当然だと思っていたため、なかなか理解できませんでした。
ということで、クラス変数とクラスインスタンス変数とインスタンス変数の違いについて。
クラス変数とは、
別名static変数とも言われ、各インスタンスが共有する変数のこと。
クラスインスタンス変数とは、
クラス変数とほぼ同じだが、そのクラスのみでしか参照できない変数のこと。例えば、そのクラスを継承したクラスではその変数にはアクセスできない。
インスタンス変数とは、
インスタンスごとに持つ変数のこと。
こんな感じ。
class MyClass @@class_var = "クラス変数" # クラス変数 @class_instance_var = "クラスインスタンス変数" # クラスインスタンス変数 # クラス変数を取得 def self.class_var @@class_var end # クラスインスタンス変数を取得 def self.class_instance_var @class_instance_var end # インスタンス変数を取得 def instance_var @instance_var = "インスタンス変数" # インスタンス変数 end end # 派生クラス class Derived < MyClass; end puts MyClass.class_var # => クラス変数 puts MyClass.class_instance_var # => クラスインスタンス変数 puts MyClass.new.instance_var # => インスタンス変数 puts Derived.class_var # => クラス変数 puts Derived.class_instance_var # => nil
派生クラスでクラスインスタンス変数がnilになるところがミソ。これさえ分かれば問題ない。
参考:http://capsctrl.que.jp/kdmsnr/wiki/bliki/?ClassInstanceVariable
Ruby Way 第2版 (Professional Ruby Series)
- 作者: Hal Fulton,豊田祐司,株式会社クイープ
- 出版社/メーカー: 翔泳社
- 発売日: 2008/04/15
- メディア: 大型本
- 購入: 2人 クリック: 221回
- この商品を含むブログ (24件) を見る