如何从外部访问以下代码中的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
答案 0 :(得分:1)
::attr_accessor
以及实例和类变量的正确用法如下。由于::attr_accessor
只是定义了实例方法对#m
和m=
,因此模块的赋值不能用于模块:
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
只能在类的实例中读取已创建。