scramble cadenza

技術ネタのガラクタ置き場

クラスメソッドでインスタンス作る話

結論

クラスインスタンス変数として扱われるっぽいです。

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

つまりどういうことだってばよ... というと、(多分)こういうことです。

f:id:mgi:20140201165935p:plain

おまけ

インスタンス変数ってなんなの?って話をしたいと思います。初めてオブジェクト指向言語を触った人が躓くポイントだと思うので。

昔の理解

でした。
ちなみにこの理解だとクラスインスタンス変数が 全く 理解できません。

今の理解
  • インスタンス変数とはオブジェクトが持つ変数のことである
    • ここで言うオブジェクトとは...
      • ruby の世界を構成する要素であり
      • (メソッドなどを介して)相互作用する モノ であり
      • 他のオブジェクトと自身を区別できる モノ(英語で言うと object)
    • ここで言う変数とは...
      • 何かしらのオブジェクトを指す。

正しいか自信が持てないけど、前よりは真実に近づいている感。

で、何が言いたい?

こういう理解をすると、クラスインスタンス変数とインスタンス変数の違いが、なんとなく理解できます。
即ち

ということ。
まぁこの理解、今後も更新されて変わっていくと思います。