Использование метода для генерации нескольких экземпляров другого класса
Я пытаюсь позволить методу инициировать несколько экземпляров другого класса.
class Players
def initialize(players)
@players = players
end
def generate_boards
@players.each do |player|
board = BingoBoardGenerator.new
player = BingoBoard.new(player, board.generate)
p player
end
end
end
players = ["Nick","Jiyoon","Mae","Lawson","Matthew"]
plays = Players.new(players)
plays.generate_boards
p player
показывает, что пять экземпляров BingoBoard
были созданы правильно, но я не уверен, как получить к ним доступ (или где они находятся). Любая помощь о том, как вызвать эти случаи? Обычно я бы сделал:
nick = BingoBoard.new("Nick", board.generate)
nick.board
но когда я создаю их все вместе, я не знаю, как установить / получить доступ к имени их экземпляра.
1 ответ
Как указано пользователем 2864740, вы можете использовать :map
вместо :each
вернуть массив BingoBoard
экземпляров. Если вы хотите сохранить эти экземпляры для последующего использования, вы можете использовать памятку, как показано ниже. Первый раз :bingo_board_instances
вызывается, доски будут сгенерированы и переменная экземпляра @bingo_board_instances
будет установлен так, чтобы будущие вызовы :bingo_board_instances
не приведет к генерации новых досок.
class Players
def initialize(players)
@players = players
end
def generate_boards
@players.map do |player|
board = BingoBoardGenerator.new
BingoBoard.new(player, board.generate)
end
end
def bingo_board_instances
@bingo_board_instances ||= generate_boards
end
end
Хотя приведенный выше код работает просто отлично, я думаю, что более интуитивным решением было бы иметь Player
класс (вместо Players
), а затем передать в массив Player
случаи при инициализации BingoBoardGenerator
, При таком подходе вы можете установить переменную экземпляра для каждого отдельного игрока и создать уникальную доску, которая принадлежит игроку:
class BingoBoardGenerator
def initialize(args)
#dynamically set instance vars to handle n number of players
args.fetch(:players).each_with_index do |player,index|
instance_variable_set("@player_#{index+1}",player)
end
end
def generate_boards
instance_variables.map do |player|
player = instance_variable_get(instance_var)
#you will need to implement :generate_bingo_board on player...I would suggest using memoization so you can store the player's board for later retrieval
player.generate_bingo_board
end
end
end
#I have no idea what your implementation looks like...
b = BingoBoardGenerator.new(players: [Player.new("Jen"),Player.new("Phil"),Player.new("Mary"),Player.new("Bert")])
b.generate_boards
Это позволит вам лучше инкапсулировать данные, которые могут принадлежать отдельным игрокам, включая возможность спрашивать каждого Player
экземпляр для его :board
,