Ruby元编程:初始化singleton_class变量

kno*_*opx 4 ruby singleton var initialization

  • 为什么Foo.val回来nil而不是"foo"在打电话之前Foo.set
  • 是否有任何初始化@val课堂评估的机制?
  • 在哪个范围@val = "foo"存储?

    class Foo
      class << self
        @val  = "foo"
        attr_reader :val
    
        def set(val)
          @val = val
        end
      end
    end
    
    p Foo.val # nil
    Foo.set("bar")
    p Foo.val # "bar"
    
    Run Code Online (Sandbox Code Playgroud)

Vic*_*gin 9

您可以@val像这样在Foo中初始化:

class Foo
  @val  = "foo"
  class << self
    attr_reader :val

    def set(val)
      @val = val
    end
  end
end

p Foo.val         #=> "foo"
Foo.set("bar")
p Foo.val         #=> "bar"
Run Code Online (Sandbox Code Playgroud)

你的代码@val不是在Foo上初始化,而是在Foo的元类上初始化