Есть ли более чистый способ написать это? (Блоки Ruby / Rails, возвращаемое значение) - PullRequest
0 голосов
/ 24 октября 2010
  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  

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

  def find_users_online(count = 1)        
    users = Array.new
    count.times.and_return do # <== something like this
      users += get_users_online
    end
  end  

Ответы [ 5 ]

3 голосов
/ 24 октября 2010

Другой вариант - , возвращающий блок

  returning(users = Array.new) do |users|
      count.times { users += get_users_online }
  end
3 голосов
/ 24 октября 2010

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

count.times.map {get_users_online}.flatten
2 голосов
/ 24 октября 2010

Проверьте #tap. Это новый способ «возвращения».

def find_users_online(count = 1)   
  [].tap do |users|
    count.times { users += get_users_online }
  end
end
2 голосов
/ 24 октября 2010

Как насчет

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

0 голосов
/ 24 октября 2010
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 }
...