Доступ к переменной экземпляра класса из другого класса - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть этот класс в файле "ghost.rb":

class Ghost
  attr_accessor :fragment

  def initialize(number_of_players)
    @fragment = ''
  end
end

Я пытаюсь получить доступ к @fragment из другого файла в том же каталоге.Ниже находится «aiplayer.rb» в том же каталоге.

require "./ghost"

class Aiplayer
  attr_reader :aiplayer

  def initialize
    @aiplayer = Player.new('AI Player')
  end

  def fragment_printer
    Ghost.fragment
  end
end

Когда я инициализирую экземпляр Aiplayer и вызываю для него метод fragment_printer, я получаю следующую ошибку:

NoMethodError: undefined method `fragment' for Ghost:Class
from aiplayer.rb:17:in `fragment_printer'

У меня там attr_accessor, и поэтому я не уверен, почему не могу получить переменную fragment вне класса Ghost.У меня проблемы с доступом к переменным экземпляра класса извне класса.Кто-нибудь может дать мне объяснение по этому поводу?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Кто-нибудь может дать мне краткое объяснение этого?Я уверен, что объяснение простое, но я не могу найти ответ на вопрос, почему.

Вы написали Ghost.fragment - это не метод экземпляра, это метод класса.

Методы класса не связаны с объектом.Вы можете прочитать об этом

метод поиска в Ruby self.fragment в Ghost классе, но не можете его найти.

NoMethodError: undefined method `fragment' for Ghost:Class

Вот причина вашегопроблема.

Далее зависит от того, что вы хотите.Например, вы можете написать Ghost.new(5).fragment.В этом случае #fragment - это метод экземпляра, который возвращает @fragment

Я надеюсь, что смогу дать вам представление.

0 голосов
/ 13 февраля 2019

Чтобы связать экземпляры, вы можете передать экземпляр Ghost в экземпляр Aiplayer при инициализации.

class Aiplayer
  attr_accessor :ghost

  def initialize(ghost_to_attach)
    self.ghost = ghost_to_attach
  end

  def fragment_printer
    ghost.fragment
  end

end

x = Ghost.new
y = Aiplayer.new(x)

x.fragment = 'foo'

y.fragment_printer
=> "foo"

Это работает, потому что объект, хранящийся в переменной x, является тем же объектом, который хранится в экземпляре Aiplayer ghost атрибут.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...