Есть ли чистый способ написать это? (Blocks Ruby / Rails, возвращаемое значение)
-
25-09-2019 - |
Вопрос
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 }
Не связан с StackOverflow