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  
Foi útil?

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
scroll top