Действительно важная концепция здесь. «Внутренний класс» не делает то, что вы думаете. Между этими двумя классами нет абсолютно никакого отношения или особого поведения, кроме пространства имен. По сути, просто относитесь к внутреннему классу так, как будто он определен совершенно отдельно, потому что так он себя ведет.
Однако вы можете передать конструктору GameBoard
ссылку на экземпляр Game
, чтобы получить доступ к переменным экземпляра:
(обратите внимание, что я показываю только те части, которые имеют отношение к ответу, и опускаю другие биты вашего кода ради краткости):
class GameBoard
attr_reader :game
def initialize(game)
@game = game
end
end
class Game
def initialize(player1_name, player2_name)
@player1 = Player.new(player1_name, 'X')
@player2 = Player.new(player2_name, 'O')
# Note I pass the Game instance as self here:
@gameboard = GameBoard.new(self)
end
end
Тогда внутри GameBoard
методов экземпляра вы можете сделать что-то вроде этого:
game.player1.moves[game.player1.turn]
game
вот метод, сгенерированный attr_reader (ссылающийся на переменную экземпляра @game
, установленную в initialize).