Ruby: метод attr_accessor не определен при вызове во внешнем модуле - PullRequest
0 голосов
/ 26 января 2019

У меня есть класс 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) в отдельном модуле, как показано ниже:

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 голосов
/ 26 января 2019

Вы пытаетесь получить доступ к переменным экземпляра без создания экземпляра объекта 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'

Если вы не знаете, что такое переменные экземпляра и класса, прочитайте этот пост .

0 голосов
/ 26 января 2019

Вы присваиваете переменные экземпляра в вашем методе initialize.Но в модуле вы пытаетесь вызвать методы класса на Foo::Bar.

Сначала вам нужно создать экземпляр Foo::Bar, а затем вызвать методы получения для этого экземпляра:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...