我在模块中定义了一个ruby类,如下所示
module Foo
class Bar
attr_accessor :attr_1, :attr_2, :attr_3
def initialize
@attr_1 = "a"
@attr_2 = "b"
@attr_3 = "c"
end
end
end
然后,我尝试在单独的模块中访问实例变量(或attr_accessor定义的getter),如下所示:
module AccessingModule
def get_instance_variables
var_1 = Foo::Bar.attr_1
var_2 = Foo::Bar.attr_2
var_3 = Foo::Bar.attr_3
end
end
尝试致电var_1 = Foo::Bar.attr_1
时出现错误NoMethodError: undefined method attr_1 for Foo::Bar:Class
有人知道阻止我访问attr_accessor中定义的内容的原因吗?
答案 0 :(得分:1)
您正在通过initialize
方法分配实例变量。但是在模块中,您尝试在Foo::Bar
上调用类方法。
您需要先创建Foo::Bar
的实例,然后在该实例上调用getter方法:
module AccessingModule
def get_instance_variables
foo_bar = Foo::Bar.instance # get the Singleton instance of `Foo::Bar`
var_1 = foo_bar.attr_1
var_2 = foo_bar.attr_2
var_3 = foo_bar.attr_3
end
end
答案 1 :(得分:0)
您试图访问实例变量而不实例化Foo::Bar
对象。首先创建Foo::Bar
的实例,然后您可以访问attr_1
,attr_2
...
bar = Foo::Bar.new
bar.attr_1 # => 'a'
现在,如果要访问属性而不实例化对象,则需要将它们定义为类变量:
module Foo
class Bar
@@attr_1 = 'a'
def self.attr_1
@@attr_1
end
end
end
Foo::Bar.attr_1 # => 'a'
如果您不知道实例和类变量是什么,请阅读this post。