C'è un modo più pulito per scrivere questo? (Vermiglio / Rails blocchi, valore di ritorno)
-
25-09-2019 - |
Domanda
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
Nel codice precedente im deve rimettere la variabile "utenti" alla fine della funzione per restituire il valore corretto (utenti). Ma è possibile che i tempi di blocco restituisce i valori degli utenti e posso rimuovere "utenti" alla fine della funzione?
def find_users_online(count = 1)
users = Array.new
count.times.and_return do # <== something like this
users += get_users_online
end
end
Soluzione
Scopri #tap. E 'il modo nuovo conio di fare "il ritorno".
def find_users_online(count = 1)
[].tap do |users|
count.times { users += get_users_online }
end
end
Altri suggerimenti
La soluzione di Lavir è buono se get_users_online restituirà lo stesso valore molto tempo si chiama. In caso contrario, è necessario qualcosa di simile:
count.times.map {get_users_online}.flatten
Un'altra opzione è il ritorno blocco
returning(users = Array.new) do |users|
count.times { users += get_users_online }
end
Come su
def find_users_online(count = 1)
(1..count).map{ get_users_online }.flatten
end
get_users_online * count
Ma get_users_online () deve restituire lo stesso valore durante l'esecuzione di questa funzione.
Se questo non è il vostro caso, quindi usare
(1..count).map { get_users_online }.reduce(:+)
o utilizzando Sfaccettature:
count.of { get_users_online }.sum
C'è anche modo più interessante:
(1..count).inject(Array.new) { |ignore, users| users + get_users_online }