Передача переменных между классами в Ruby на Rails - PullRequest
0 голосов
/ 16 апреля 2020

Итак, у меня есть два файла, один называется a.rb, а другой - b.rb. Вот содержимое обоих:

# a.rb
class A
    def initialize
        @variable = ""

        @module_b = B.new(self)
    end

    def pass_to_b(self)
        @module_b.do_something(@variable)
    end

    def set_variable(var)
        # var = empty
        @variable = var
    end
end

и

# b.rb
class B
    def initialize(module_a)
        @module_a = module_a
    end

    def set_variable_in_a(data)
        @module_a.set_variable(data)
    end

    def do_something(variable)
        # variable = empty
        set_variable_in_a("hello world")
    end
end

Это всего лишь пример того, с чем я имею дело. Если я пытаюсь запустить функцию в классе A, которая должна что-то делать в ClassB, а затем изменить переменную экземпляра в классе A, я не уверен, как это сделать правильно. Однако это то, что я пробовал:

a = A.new
a.pass_to_b

Класс B не может видеть переменную экземпляра @variable, и если он пытается set_variable_in_a, это тоже не работает. Это похоже на то, что функция do_something в классе A успешно вызывает функцию do_something в классе B, но информация о переменной экземпляра недоступна. Я думал, что, передав self классу B, мы сможем хотя бы вызвать функцию

1 Ответ

1 голос
/ 16 апреля 2020

Мой MRI выбрасывает исключение около

def pass_to_b(self)

, потому что вы не можете передать self методу в качестве аргумента.

Вам нужно удалить 'self' how аргумент

Выполнить код ниже, и вы увидите, что @variable экземпляра класса A имеет строку «123hello world»

class A
  def initialize
    @variable = "123"

    @module_b = B.new(self)
  end

  def pass_to_b
    @module_b.do_something(@variable)
  end

  def set_variable(var)
    # var = empty
    @variable = var
  end
end

# b.rb
class B
  def initialize(module_a)
    @module_a = module_a
  end

  def set_variable_in_a(data)
    @module_a.set_variable(data)
  end

  def do_something(variable)
    set_variable_in_a(variable + "hello world")
  end
end

a = A.new
a.pass_to_b

отображаемую переменную «a», и вы увидите что-то вроде

#<A:0x00007fdaba0f3c90 @variable="123hello world", @module_b=#<B:0x00007fdaba0f3c40 @module_a=#<A:0x00007fdaba0f3c90 ...>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...