Ruby:用于在Struct内部定义常量的语法

use*_*428 3 ruby

考虑以下(正确的)Ruby程序:

class Outer

  Inner = Struct.new(:dummy) do
    CONST = 'abce'
    def fun
      puts(dummy)
    end
  end

end

obj = Outer::Inner.new(15)
obj.fun
puts(Outer::CONST)
Run Code Online (Sandbox Code Playgroud)

为什么我要写Outer::CONST而不是Outer::Inner::CONST

我传递给块的理解Struct::newself必然Outer::Inner,而事实上,我们可以看到,该方法(fun)连接到内部类; 但CONST显然不是.

Ste*_*fan 9

发生这种情况是因为常量在当前命名空间中定义.在classmodule关键字定义命名空间,但是Struct.new(就像Class.new)没有.

要在Struct的范围内定义常量,必须使用 self::

class Outer
  Inner = Struct.new(:dummy) do
    self::CONST = 'abce'
  end
end

Outer::Inner::CONST
#=> 'abce'

Outer::CONST
#=> NameError uninitialized constant Outer::CONST
Run Code Online (Sandbox Code Playgroud)