2016-11-01 3 views
0

Avec le code ci-dessous, j'aimerais créer une to_s méthode qui affiche les informations comme telles:Comment créer un to_s avec une variable d'instance pointant vers un tableau d'objets d'une autre classe?

Southside a 3 membres de l'équipe. Ces membres sont: Dario, qui a 22 ans. Ted, qui a 21 ans. Bob, qui a 44 ans.

Actuellement, je reçois ceci:

Southside a 3 membres de l'équipe. Ces membres sont:

[#<Person:0x000000025cd6e8 @name="Dario", @age=22>, #<Person:0x000000025cd670 @name="Ted", @age=21>, #<Person:0x000000025cd620 @name="Bob", @age=44>]. 
#<Team:0x000000025cd7d8> 

La partie que je trouve difficile accède aux variables d'instance des objets de classe personne qui se trouvent dans le tableau des membres de l'équipe.

Voici les deux classes:

class Team 
    attr_accessor :name, :members 

    def initialize(name) 
    @name = name 
    @members = [] 
    end 

    def <<(person) 
    members.push person 
    end 

    def to_s 
    puts "#{@name} has #{@members.size} team members." 
    puts "Those members are: #{@members}." 
    end 
end 

class Person 
    attr_accessor :name, :age 

    def initialize(name, age) 
    @name = name 
    @age = age 
    end 
end 

south_side_bowlers = Team.new("Southside") 

south_side_bowlers << Person.new("Dario", 22) 
south_side_bowlers << Person.new("Ted", 21) 
south_side_bowlers << Person.new("Bob", 44) 

puts south_side_bowlers 

Répondre

2

Define to_s ("#{@name}, who is #{@age} years old") pour la classe Person. Ensuite, vous pouvez le faire @members.map{ |m| m.to_s}.join('. ')

+0

Murad, cela fonctionne bien. Une question: les 'to_s' dans 'm.to_s' sont-ils inutiles? – user169320

+0

@ user169320 Vous pouvez faire '@ members.map (&: to_s) .join ('.')' Si vous le souhaitez. –

+0

user169320, Murad vous suggère de changer la deuxième ligne de 'Team # to_s' à' "Ces membres sont: # {@ members.map {| m | m.to_s} .join ('.')}.' ' (en plus d'ajouter 'Person # to_s') –

1

Tout d'abord, vous ne voulez pas avoir puts dans une méthode to_s. Au lieu de cela, renvoyez simplement la chaîne. Deuxièmement, la variable members n'est probablement pas ce que vous voulez sortir dans la méthode. Essayez ceci à la place

def to_s 
    %Q(#{@name} has #{@members.size} team members. Those members are #{@members.map{|i| "#{i.name} who is #{i.age}"}.join(', ')}) 
end 
+1

Je préfère cette approche à @ Murad en ajoutant la méthode' Person # to_s' est à la fois inutile et potentiellement confuse pour les lecteurs qui ne regardent que le codage de la classe 'Person'. Eli, pourquoi '% Q (...)' plutôt que de simples guillemets? –