2012-03-13 4 views
1

Je cours dans cet exercice sur l'utilisation blocs puis en les appelant avec rendement. Il ressemble à ceci:Ruby: blocs et le rendement

class Hero 
    def initialize(*names) 
    @names = names 
    end 
    def full_name 
    # a hero class allows us to easily combine an arbitrary number of names 
    # this is where yield should be 
    end 
end 

def names 
    heroes = [Hero.new("Christopher", "Alexander"), 
      Hero.new("John", "McCarthy"), 
      Hero.new("Emperor", "Joshua", "Abraham", "Norton")] 
    # I have to use #map and #join to unify names of a single hero 
end 

Valeur de retour devrait ressembler à ceci:

["Christopher Alexander", "John McCarthy", "Emperor Joshua Abraham Norton"] 

Je sais comment utiliser généralement des blocs et le rendement. J'ai fait des exercices très simples avant cela mais je ne peux pas résoudre celui-ci.

Répondre

2

Cela semble une demande étrange, mais si vous devez utiliser le rendement et joindre que vous écrivez dans les commentaires c'est la solution:

class Hero 
    def initialize(*names) 
    @names = names 
    end 
    def full_name 
    if block_given? 
     yield @names 
    else 
     @names.join(' ') 
    end 
    end 
end 

def names 
    heroes = [Hero.new("Christopher", "Alexander"), 
      Hero.new("John", "McCarthy"), 
      Hero.new("Emperor", "Joshua", "Abraham", "Norton")] 
    heroes.map { |h| h.full_name { |name| name.join(' ') } } 
end 
+0

Cela a fonctionné merci beaucoup =) – Barbared

3

Utilisez Array#join. Vous n'avez pas besoin de yield ou de quelque chose de fantaisie.

+0

Chaque élément de héros est un objet. Ce n'est pas un tableau, donc je ne peux pas utiliser join: la méthode undefined 'join 'pour # – Barbared

+0

' Array # join' est une convention pour écrire' instance method 'join' de la classe' Array'. – Reactormonk

+0

Je suis désolé mais je suis un débutant en ruby. Join est une méthode pour la classe Array. Mais les héros sont faits d'instances de classe Héros et je ne comprends pas comment les rejoindre car ils ne sont pas des tableaux. – Barbared

Questions connexes