Ruby 使用方法生成另一个类的多个实例

Ruby 使用方法生成另一个类的多个实例,ruby,multiple-instances,instances,Ruby,Multiple Instances,Instances,我试图让一个方法启动另一个类的多个实例 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

我试图让一个方法启动另一个类的多个实例

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

但是当我一起实例化它们时,我不知道如何设置/访问它们的实例名。

如用户2864740所示,您可以使用:map而不是:each来返回BingoBoard实例数组。如果要存储这些实例以供以后使用,可以使用如下所示的备忘录。第一次调用:bingo_board_实例时,将生成板,并设置实例变量@bingo_board_instances,以便将来调用:bingo_board_实例时不会生成新板

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类而不是Player,然后在初始化BingoBoardGenerator时传入一个Player实例数组。通过这种方法,您可以为每个玩家设置一个实例变量,并创建属于该玩家的唯一棋盘:

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  

这将允许您更好地封装可能属于单个玩家的数据,包括向每个玩家实例请求其:board的功能

如果从generate boards返回一个boards数组,则可以使用boards=plays.generate_boards;boards[0]。player,例如。按目前的情况,该函数不返回任何有用的值。我建议研究并使用它,而不是每个..谢谢,我明白你关于将变量boards=设置为生成板的意思。我重新整理了一下我的代码,我想我现在有了正确的想法。