LoginSignup
2
1

More than 5 years have passed since last update.

Ruby|特異クラスにクラス変数を定義してみる

Posted at

特異クラスにも定義できるのかな?と思ったのでやったことメモです。

動作環境

Ruby 2.3.1
OS X El Capitan 10.11.6

やったこと

まず、クラスメソッドを定義する方法で定義してみました。

class C
  class << self
    @@val = 100
  end
end

C.singleton_class.class_variables #=> []
C.class_variables #=> [:@@val]

むむ、なんかうまくいかない。。。

なんでこれがうまく行くと思ったかというと、クラスインスタンス変数は思った通りの動きをしているからなんです。

class D
  @val = 20 # クラスDのクラスインスタンス変数
  class << self
    @val = 10 # 特異クラスのクラスインスタンス変数

    def get_val
      @val
    end
  end
end

p D.get_val #=> 20
p D.singleton_class.instance_variable_get(:@val) #=> 10

クラス変数については、どうやらここを参考にしますと
クラス変数のスコープはレキシカルスコープに従うとこのこと

つまり、この場合でいうとDにあるように振る舞うということになります。

なので、トップレベルで似たようなことをすると・・・

class E
end

class << E
  @@val = 100 # warning: class variable access from toplevel
end

ワーニングでましたね:sob:

ひとまず、class_variable_setを使うしか方法はないのかな?と思っています。

class D
end

D.singleton_class.class_variable_set(:@@val, 100)
p D.singleton_class.class_variable_get(:@@val)
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1