如何从更加模块访问模块的实例变量?

时间:2016-02-05 15:49:54

标签: ruby module

我有模块

module SomeModule
  @param = 'Hello'
end

module Reporter
  include SomeModule
  def self.put
    puts @param
  end
end

当我调用Reporter::put时,我没有输出,我认为Reporter模块无法访问实例变量@param。有没有办法从Reporter模块访问该变量?

3 个答案:

答案 0 :(得分:3)

box-shadow: inset 3px -5px 81px 97px rgba(0,0,0,0.89);

答案 1 :(得分:1)

您可以使用类变量而不是instanse变量

module SomeModule
  @@param = 'Hello'
end

module Reporter
 include SomeModule
 def self.put
  puts @@param
 end
end

Reporter.put打印123并在这种情况下返回nil

答案 2 :(得分:0)

实例变量称为实例变量,因为它们属于对象(又名“实例”)。您的示例中有两个对象:SomeModuleReporter。两者都有自己的实例变量。 SomeModule有一个名为@param的实例变量,Reporter有一个名为@param的实例变量。这两个实例变量完全不相关,即使它们具有相同的名称。想象一下混乱,如果每个对象都必须为变量提供自己的名称!

  

有没有办法从Reporter模块访问该变量?

没有。您无法从不同对象访问实例变量。对象只能访问其自己的实例变量。

[注意: 可能使用反射(例如Object#instance_variable_getBasicObject#instance_evalBasicObject#instance_exec),当然。使用反射可以做很多事情。]

可以做的是创建一个方法,让您可以读取该实例变量。这种方法称为属性读取器

module SomeModule
  def self.param; @param end
  @param = 'Hello'
end

module Reporter
  def self.put
    puts SomeModule.param
  end
end

甚至有一种方法可以自动生成这样的方法,它被称为Module#attr_reader

module SomeModule
  class << self; attr_reader :param end
  @param = 'Hello'
end

module Reporter
  def self.put
    puts SomeModule.param
  end
end

如果您还要写入实例变量,还需要定义相应的属性writer 方法:

module SomeModule
  class << self
    attr_reader :param

    private

    def param=(param)
      @param = param
    end
  end

  self.param = 'Hello'
end

module Reporter
  def self.put
    puts SomeModule.param
  end
end

还有一个名为Module#attr_writer的对应方法,它为您生成属性编写器方法:

module SomeModule
  class << self
    attr_reader :param

    private

    attr_writer :param
  end

  self.param = 'Hello'
end

module Reporter
  def self.put
    puts SomeModule.param
  end
end