2010-10-24 92 views
0
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必须在函数的末尾再次放置“users”变量以返回正确的值(用户)。但是有可能时间块返回用户值,我可以删除功能结束时的“用户”?有没有更清晰的方式来写这个? (Ruby/Rails块,返回值)

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

因为在代码结束之前让你的“返回指示”有四行可读性或直观性更强吗?想象一下,如果你的街区长达100行,你会如何看懂它? – 2010-10-24 16:01:09

+0

你为什么要多次调用'get_users_online'? – 2010-10-24 16:14:27

+2

@Platinum:如果他的区块长度为100行,他会遇到比这个更大的问题...... ;-) – 2010-10-24 16:17:38

回答

2

退房#tap。这是新的方式来做“返回”。

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

谢谢,这就是我正在寻找。 但是我必须将+ =改成“它适用于我的情况 – ipsum 2010-10-24 17:26:03

0
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 } 
2

如何

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

+0

您将得到数组数组。 – 2010-10-24 16:22:33

+0

@Lavir:取决于get_users_online返回的内容,不是?我想,如果是的话,加上'.flatten'就可以解决它。 – 2010-10-24 16:34:20

+0

在问题中有“+ =”但不是“<<”。这意味着“get_users_online()”返回数组。 – 2010-10-24 16:40:08

3

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

count.times.map {get_users_online}.flatten 
+0

你也会得到数组的数组。 – 2010-10-24 16:22:57

+0

这个解决方案是必须写count.times.map {get_users_online} [0],因为我得到一个数组中的数组 – ipsum 2010-10-24 16:27:08

+0

这将导致以下结果:[[“User1”,“User2”],[“User3” ,“User4”]] => [“User1”,“User2”] – 2010-10-24 16:41:56

3

另一种选择是返回

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

请注意,在Rails 3中删除了返回(甚至不推荐使用),以支持#tap。 – 2010-10-24 17:21:45

+0

感谢您纠正我 – 2010-10-24 17:56:46

相关问题