使用一种方法生成另一个方法的多个实例 class
Using a method to generate multiple instances of another class
我试图让一个方法启动另一个 class 的多个实例。
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
但是当我一起实例化它们时,我不知道如何set/access它们的实例名称。
如 user2864740 所示,您可以使用 :map
而不是 :each
来 return 一个 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
class(而不是 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
的能力。
我试图让一个方法启动另一个 class 的多个实例。
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
但是当我一起实例化它们时,我不知道如何set/access它们的实例名称。
如 user2864740 所示,您可以使用 :map
而不是 :each
来 return 一个 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
class(而不是 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
的能力。