[ruby-list:50641] 特異クラスでのクラス変数

From: Akret Node <node.akret@...>
Date: 2018-01-07 17:15:35 UTC
List: ruby-list #50641
のぐちと申します。

特異クラスの中でクラス変数を定義した場合に
クラスと共有する理由はなんでしょうか??

class C
  class << self
    FOO = "foo"
    @@bar = "bar"
    @bazz = "bazz"
  end
end

p C.const_get :FOO # 例外
p C.singleton_class.const_get :FOO # "foo"

p C.class_variable_get :@@bar # "bar"
p C.singleton_class.class_variable_get :@@bar # "bar"

p C.instance_variable_get :@bazz # nil
p C.singleton_class.instance_variable_get :@bazz # "bazz"

また、class << 構文をトップレベルに書いた場合に
クラス変数を定義するとトップレベル(Object)に定義するようです。
一寸、レキシカルに決定しているように見えますが
class << 構文はレキシカルスコープを別途つくりますよね?

val = 10
class << Object
  p val # ブロックのようにはならず例外が発生する
end

この動作は若干、混乱するのですがこの構文解釈にいたった経緯はなんでしょう?

In This Thread

Prev Next