2015-08-25 2 views
0

J'essaie de laisser une méthode initier plusieurs instances d'une autre classe.Utilisation d'une méthode pour générer plusieurs instances d'une autre classe

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 montre que cinq cas de BingoBoard ont été créés correctement, mais je ne suis pas sûr de savoir comment y accéder (ou là où ils sont). Toute aide sur comment appeler ces instances? Normalement, je ferais:

nick = BingoBoard.new("Nick", board.generate) 
nick.board 

mais quand je les instancier tous ensemble, je ne sais pas comment configurer/accéder à leur nom d'instance.

+0

* Si * retournant un tableau de cartes de "générer des cartes", alors on pourrait utiliser 'boards = plays.generate_boards; boards [0] .joueur', ex. * Comme c'est actuellement la fonction ne renvoie aucune valeur utile. * Je suggérerais de regarder dans ['Array # map'] (http://ruby-doc.org/core-2.2.0/Array.html#method-i- map) et en l'utilisant à la place de chaque .. – user2864740

+0

Merci, je vois ce que vous dites sur la mise en place des tableaux variables = sur les tableaux générateurs. J'ai réarrangé un peu mon code et je pense avoir la bonne idée maintenant. –

Répondre

0

Comme indiqué par l'utilisateur 2864740, vous pouvez utiliser :map au lieu de :each pour renvoyer un tableau de BingoBoard instances. Si vous souhaitez stocker ces instances à utiliser ultérieurement, vous pouvez utiliser la mémorisation comme indiqué ci-dessous. La première fois que :bingo_board_instances est appelée, les cartes sont générées et la variable d'instance @bingo_board_instances est définie de sorte que les prochaines invocations de :bingo_board_instances n'entraînent pas la génération de nouvelles cartes.

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 

Alors que le code ci-dessus fonctionne très bien, je pense que la solution la plus intuitive serait d'avoir une classe Player (au lieu de Players), puis passer dans un tableau de Player cas lors de l'initialisation d'un BingoBoardGenerator. Avec cette approche, vous pouvez définir une variable d'instance pour chaque joueur et de créer un conseil d'administration unique qui appartient au joueur:

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 

Cela vous permettra de mieux encapsuler les données qui peuvent appartenir à des joueurs individuels, y compris la capacité pour demander à chaque Player instance pour son :board.