Hatena::ブログ(Diary)

遅咲きのエンジニア


2008-05-25 クラス変数とクラスインスタンス変数とインスタンス変数の違いについ

クラス変数とクラスインスタンス変数とインスタンス変数の違いについて

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になるところがミソ。これさえ分かれば問題ない。

参考:no title

Ruby Way 第2版 (Professional Ruby Series)

Ruby Way 第2版 (Professional Ruby Series)

4873113679
オライリージャパン Yugui
購入: 27人 クリック: 644回

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証