Y at-il un moyen plus propre d'écrire cela? (Blocs Ruby / rails, la valeur de retour)
-
25-09-2019 - |
Question
def find_users_online(count = 1)
users = Array.new
count.times do
users += get_users_online
end
users # <==== I want to remove this here
end
Dans le code ci-dessus im revête la variable « utilisateurs » à nouveau à la fin de la fonction pour renvoyer la valeur à droite (utilisateurs). Mais est-il possible que les temps de bloquer le retour des valeurs des utilisateurs et je peux supprimer les « utilisateurs » à la fin de la fonction?
def find_users_online(count = 1)
users = Array.new
count.times.and_return do # <== something like this
users += get_users_online
end
end
La solution
Consultez #tap. Il est la nouvelle fangled façon de le faire « retour ».
def find_users_online(count = 1)
[].tap do |users|
count.times { users += get_users_online }
end
end
Autres conseils
La solution de Lavir est bon si get_users_online retournera la même valeur moment même où elle est appelée. Sinon, vous avez besoin quelque chose comme ceci:
count.times.map {get_users_online}.flatten
Une autre option est retour bloc
returning(users = Array.new) do |users|
count.times { users += get_users_online }
end
Qu'en est-
def find_users_online(count = 1)
(1..count).map{ get_users_online }.flatten
end
get_users_online * count
Mais get_users_online () doit retourner la même valeur lors de l'exécution de cette fonction.
Si ce n'est pas votre cas puis utilisez
(1..count).map { get_users_online }.reduce(:+)
ou en utilisant Facettes:
count.of { get_users_online }.sum
Il y a aussi beaucoup plus intéressant:
(1..count).inject(Array.new) { |ignore, users| users + get_users_online }