Ruby:在外部模块中调用时,attr_accessor方法未定义

时间:2019-01-26 05:19:26

标签: ruby

我在模块中定义了一个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中定义的内容的原因吗?

2 个答案:

答案 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_1attr_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