Existe uma maneira mais limpa de escrever isso? (Blocos de rubi/trilhos, valor de retorno)
-
25-09-2019 - |
Pergunta
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
No código acima, o IM deve colocar a variável "usuários" novamente no final da função para retornar o valor certo (usuários). Mas é possível que o bloco do Times retorne os valores dos usuários e eu possa remover "usuários" no final da função?
def find_users_online(count = 1)
users = Array.new
count.times.and_return do # <== something like this
users += get_users_online
end
end
Solução
Confira #tap. É a nova maneira de fazer "retornar".
def find_users_online(count = 1)
[].tap do |users|
count.times { users += get_users_online }
end
end
Outras dicas
A solução do LAVir é boa se get_users_online retornará o mesmo valor, muito tempo em que for chamado. Caso contrário, você precisa de algo assim:
count.times.map {get_users_online}.flatten
Outra opção é retornando quadra
returning(users = Array.new) do |users|
count.times { users += get_users_online }
end
Que tal
def find_users_online(count = 1)
(1..count).map{ get_users_online }.flatten
end
?
get_users_online * count
Mas get_users_online () deve retornar o mesmo valor ao executar esta função.
Se este não for o seu caso, use
(1..count).map { get_users_online }.reduce(:+)
ou usando facetas:
count.of { get_users_online }.sum
Também há uma maneira mais interessante:
(1..count).inject(Array.new) { |ignore, users| users + get_users_online }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow