如何从外部调用模块的attr_accessor变量?

时间:2014-01-29 12:21:18

标签: ruby-on-rails ruby ruby-on-rails-4

如何从外部访问以下代码中的reserved_words

module FriendlyId
   module Reserved
      module Configuration
         attr_accessor :reserved_words
      end
   end
end

执行FriendlyId::Reserved::Configuration.instance_variable_get(:reserved_words)会出现以下错误:

NameError: 'reserved_words' is not allowed as an instance variable name

1 个答案:

答案 0 :(得分:1)

::attr_accessor以及实例和类变量的正确用法如下。由于::attr_accessor只是定义了实例方法对#mm=,因此模块的赋值不能用于模块:

module M
   attr_accessor :m
end

M.instance_methods
# => [:m, :m=]
M.instance_variables
# => []

但它可以用于一个类:

class A
   include M

   def initialize
      @m = 1
      @@mm = 2
   end

   def self.mm
      @@mm
   end
end

a = A.new
p a.m
# => 1
p A.mm
# => 2
p A.new.instance_variable_get( :@m )
# => 1
p A.class_variable_get( :@@mm )
# => 2

在上面的例子中,我们定义了类变量@@mm,只有在这种情况下我们可以用::class_variable_get方法读取它,实例变量@m只能在类的实例中读取已创建。