2017-10-04 4 views
0

Pour passer un test rspec, je dois obtenir une chaîne simple à renvoyer "nombre" de fois. J'ai été googling et il semble que la méthode .times devrait aider. En théorie, d'après ce que je peux voir:La méthode Ruby .times renvoie la variable au lieu de la sortie

num = 2 
string = "hello" 

num.times do 
    string 
end 

... Devrait fonctionner? Mais la sortie continue de retourner "2", ou quoi que ce soit "num" est égal à. Je peux l'obtenir à deux reprises "puts 'hello", mais il renvoie toujours "2" après avoir imprimé "hellohello".

également essayé

num.times { string } 

Suis-je manque quelque chose de fondamental sur la méthode de .times, ici? Ou devrais-je m'y prendre autrement?

+3

la méthode 'times' appelle à plusieurs reprises un bloc de code' temps de num' - il est l'opérateur « fois » (multiplication). Pour cela, utilisez "*" par exemple. "" bonjour "* 2 # =>" bonjour " – mikej

Répondre

3

times répétera l'exécution du bloc: string sera interprété deux fois, mais la valeur ne sera utilisée pour rien. num.times renverra num. Vous pouvez le vérifier dans une console Ruby:

> 2.times{ puts "hello" } 
hello 
hello 
=> 2 

Vous n'avez pas besoin d'une boucle, vous avez besoin concaténation:

string = "hello" 
string + string 
# "hellohello" 
string + string + string 
# "hellohellohello" 

Ou tout comme avec les chiffres, vous pouvez utiliser la multiplication pour éviter des additions multiples:

string * 3 
# "hellohellohello" 
num = 2 
string * num 
# "hellohello" 

Si vous avez besoin d'une liste avec 2 éléments string, vous pouvez utiliser:

[string] * num 
# ["hello", "hello"] 

ou

Array.new(num) { string } 
# ["hello", "hello"] 

Si vous souhaitez rejoindre les cordes avec un espace au milieu:

Array.new(num, string).join(' ') 
# "hello hello" 

Juste pour le plaisir, vous pouvez aussi utiliser:

[string] * num * " " 

mais ce n'est probablement pas vraiment lisible.

0

Est-ce le comportement que vous recherchez?

def repeat(count, text) 
    text * count 
end 

repeat(2, "hello") # => "hellohello" 

(Aucune mesure n'a été prise pour la défense contre la mauvaise entrée)

+0

Essentiellement, oui. Je pense que beaucoup de réponses ici ont montré que l'utilisation d'une boucle comme .times aurait pu être une trop grande complication. – oheydrew