Ruby 范围在模块的底层

Ruby scope at the bottom level of a module

我找不到任何对此有意义的解释。

我正在尝试弄清楚如何访问我在模块中创建的变量,但不在任何 class 中,即:

module Moddy

attr_accessor :var

var = "wibble"

  class Squiggy

    def Class_Method ()

    end

  end

end

我正在尝试弄清楚如何(如果可能的话)从 'Squiggy' 的范围内以及从需要 Moddy 的脚本的范围内访问 'var'。

module Moddy

  attr_accessor :action

  def initialize
    @action= "wibble"  
  end

  class Squiggy
    include Moddy
    def initialize
      super
    end  

    def put_var
      puts @action
    end

  end

end

reference: Accessing instance variables declared in ruby modules

模块有点像 class,但 没有实例 。因此,模块中定义的实例方法本身是无用的;您需要 include class 中的那个模块才能使用它们。

这很重要,因为 attr_accessor :var 本质上定义了两个实例方法:

def var
  @var
end
def var= v
  @var = v
end

如果要var = "wibble"调用刚刚创建的实例方法,需要self成为Moddy实例,但在这种情况下 self 只是 Moddy 所以你实际上只是在创建一个名为 var.

的局部变量

如果你想让Moddy拥有var,你需要从单例class调用attr_accessor(因为Moddy是它的一个实例单例 class).

module Moddy
  class << self
    attr_accessor :var
  end
  self.var = "wibble"  
end
Moddy.var
# "wibble"