Использование метода для генерации нескольких экземпляров другого класса

Я пытаюсь позволить методу инициировать несколько экземпляров другого класса.

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,

Другие вопросы по тегам