是否有更清晰的方式来写这个? (Ruby / Rails块,返回值)

时间:2010-10-24 15:57:23

标签: ruby-on-rails ruby return-value block

  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”变量以返回正确的值(用户)。但是,时间块是否可能返回用户值,我可以删除函数末尾的“用户”?

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

5 个答案:

答案 0 :(得分:3)

如果get_users_online在调用它时会返回相同的值,那么Lavir的解决方案很好。如果没有,你需要这样的东西:

count.times.map {get_users_online}.flatten

答案 1 :(得分:3)

另一个选项是返回

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

答案 2 :(得分:2)

怎么样

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

答案 3 :(得分:2)

查看#tap。这是“回归”的新方式。

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

答案 4 :(得分:0)

get_users_online * count

但get_users_online()在执行此函数时必须返回相同的值。

如果不是这种情况,请使用

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

或使用Facets:

count.of { get_users_online }.sum

还有更有趣的方式:

(1..count).inject(Array.new) { |ignore, users| users + get_users_online }