Как передать переменную instance / accessor в ruby ​​другому классу и получить данные, хранящиеся в соответствующей переменной? - PullRequest
0 голосов
/ 04 марта 2019

Обращаясь к приведенному ниже коду, можно ли передать переменную row из class A в class B#kick и получить сохраненные данные?

class A
  attr_accessor :row

  def fetch
    B.new.kick(self.row)
    puts row.inspect
  end
end

class B
  def kick(x)
    x = [3,4]
  end
end

@test = A.new.fetch
expect(@test.row).to eql([3,4])

Текущий O / P => nil

Однако, если я передаю self и назначаю, что работает, но я не хочу использовать этот подход: Рабочий код

class A
  attr_accessor :row

  def fetch
    B.new.kick(self)
    puts row.inspect
  end
end

class B
  def kick(x)
    x.row = [3,4]
  end
end

@test = A.new.fetch
#=> [3, 4]

1 Ответ

0 голосов
/ 04 марта 2019

Короткая версия:
x = [3, 4] создаст новый экземпляр массива и сохранит в переменную x, где row будет по-прежнему ссылаться на исходное значение (или без значения nil).

Другим подходом может быть метод kick для возврата «выброшенного» значения.

class A
  def fetch
    @row = B.new.kick
    puts row.inspect
  end
end

class B
  def kick(x)
    [3,4]
  end
end

Если вы хотите следовать принципу объектно-ориентированного программирования «Скажите, не спрашивайте» васможно попробовать подход шаблон посетителя.

class A
  def fetch
    B.new.kick(self)
    puts row.inspect
  end

  def save(row)
    @row = row
  end
end

class B
  def kick(x)
    x.save([3,4])
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...