クラスメソッドでインスタンス作る話
結論
クラスインスタンス変数として扱われるっぽいです。
class Klass attr_accessor :hoge def self.hoge(hoge) @hoge ||= hoge end end # @hoge に値が入る Klass.hoge('hoge') #=> "hoge" # もう既に @hoge には値が入っているので、'fuga' は入らない Klass.hoge('fuga') #=> "hoge" # クラスインスタンス変数 と インスタンス変数は別物 Klass.new.hoge #=> nil
つまりどういうことだってばよ... というと、(多分)こういうことです。
おまけ
インスタンス変数ってなんなの?って話をしたいと思います。初めてオブジェクト指向言語を触った人が躓くポイントだと思うので。
昔の理解
- インスタンス変数とは クラスの中の変数のことである
でした。
ちなみにこの理解だとクラスインスタンス変数が 全く 理解できません。
今の理解
- インスタンス変数とはオブジェクトが持つ変数のことである
- ここで言うオブジェクトとは...
- ruby の世界を構成する要素であり
- (メソッドなどを介して)相互作用する モノ であり
- 他のオブジェクトと自身を区別できる モノ(英語で言うと object)
- ここで言う変数とは...
- 何かしらのオブジェクトを指す。
- ここで言うオブジェクトとは...
正しいか自信が持てないけど、前よりは真実に近づいている感。
で、何が言いたい?
こういう理解をすると、クラスインスタンス変数とインスタンス変数の違いが、なんとなく理解できます。
即ち
- クラスインスタンス変数 とは クラスが持っている変数のこと
- インスタンス変数 とは インスタンスが持っている変数のこと
- インスタンスとはクラスから(new メソッドにより)生成されたオブジェクトと定義
ということ。
まぁこの理解、今後も更新されて変わっていくと思います。