¿Hay una forma más limpia de escribir esto? (Bloques de rubias/rieles, valor de retorno)
-
25-09-2019 - |
Pregunta
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
En el código anterior, IM debe volver a colocar la variable "Usuarios" al final de la función para devolver el valor correcto (usuarios). Pero, ¿es posible que The Times Block devuelva los valores de los usuarios y puedo eliminar "usuarios" al final de la función?
def find_users_online(count = 1)
users = Array.new
count.times.and_return do # <== something like this
users += get_users_online
end
end
Solución
Mira #tap. Es la forma nueva de hacer "regresar".
def find_users_online(count = 1)
[].tap do |users|
count.times { users += get_users_online }
end
end
Otros consejos
La solución de Lavir es buena si get_users_online devolverá el mismo valor que se llama. Si no, necesitas algo como esto:
count.times.map {get_users_online}.flatten
Otra opción es que regresa bloquear
returning(users = Array.new) do |users|
count.times { users += get_users_online }
end
Qué tal si
def find_users_online(count = 1)
(1..count).map{ get_users_online }.flatten
end
?
get_users_online * count
Pero get_users_online () debe devolver el mismo valor al ejecutar esta función.
Si este no es su caso, use
(1..count).map { get_users_online }.reduce(:+)
o usar facetas:
count.of { get_users_online }.sum
También hay una manera más interesante:
(1..count).inject(Array.new) { |ignore, users| users + get_users_online }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow