【问题标题】:How to call a module's attr_accessor variable from outside?如何从外部调用模块的 attr_accessor 变量?
【发布时间】:2014-02-21 06:01:43
【问题描述】:

如何从外部访问下面代码中的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

【问题讨论】:

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


【解决方案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只有在类的实例被创建时才能被读取。

【讨论】:

    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 2015-10-31
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多