Есть ли чистый способ написать это? (Blocks Ruby / Rails, возвращаемое значение)

StackOverflow https://stackoverflow.com/questions/4008980

Вопрос

  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  

В коде выше IM необходимо снова поставить переменную «пользователей» в конце функции, чтобы вернуть правильное значение (пользователи). Но возможно ли, что Times Block возвращает значения пользователей, и я могу удалить «пользователи» в конце функции?

  def find_users_online(count = 1)        
    users = Array.new
    count.times.and_return do # <== something like this
      users += get_users_online
    end
  end  
Это было полезно?

Решение

Оформить #tap. Это новый пункт, чтобы сделать «возвращение».

def find_users_online(count = 1)   
  [].tap do |users|
    count.times { users += get_users_online }
  end
end

Другие советы

Решение Lavir хорошо, если get_users_online вернет то же значение, очень время, когда он называется. Если нет, вам нужно что-то подобное:

count.times.map {get_users_online}.flatten

Другой вариант есть возвращение блокировать

  returning(users = Array.new) do |users|
      count.times { users += get_users_online }
  end

Как насчет

def find_users_online(count = 1)
  (1..count).map{ get_users_online }.flatten
end

?

get_users_online * count

Но get_users_online () должен вернуть то же значение при выполнении этой функции.

Если это не ваше дело, то используйте

(1..count).map { get_users_online }.reduce(:+)

или используя грани:

count.of { get_users_online }.sum

Есть также более интересный способ:

(1..count).inject(Array.new) { |ignore, users| users + get_users_online }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top