2010-10-24 99 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

相關問題