2013-08-30 79 views
0

我目前正在做測試第一編程,並卡住了位於http://testfirst.org/live/learn_ruby/performance_monitor的06_performance監視器問題我在stackoverflow上發現了一個類似的線程,但我仍然不理解問題。我沒有通過最後兩次測試來找到多個塊的平均運行時間。我的代碼到目前爲止是:找到塊的平均運行時間有問題

def measure(i=1) 
    if i>1 
    i.times do 
     yield 
    end 
    else 
    x = Time.now 
    yield 
    elapsed_time = Time.now - x 
    end 
end 

我很困惑什麼測試試圖做。到目前爲止,這是我認爲我必須做的:

我相信任務是找出某些塊運行需要多長時間。 但是,我不確定爲什麼這個代碼甚至可以用於前幾個測試。而且,我也在確切知道yield語句返回的問題。如果有人能通過解決這個問題的過程讓我理解解決方案,我會非常感激。

回答

0

你的方法主要是OK,到目前爲止,除了你不需要另闢蹊徑i == 1i > 1 - { 1.times { yield }在功能上等同於只調用yield

yield不會自行返回任何東西。它是指賦予方法的塊應該被稱爲關鍵字,可以選擇性地送入這反過來將得到傳遞給塊變量,如:

class String 
    def each_character_in_reverse_order 
    each_char.to_a.reverse_each do |char| 
     yield char 
    end 
    end 
end 

"hello".each_character_in_reverse_order do |c| 
    puts c.upcase 
end 

#=> 
# O 
# L 
# L 
# E 
# H 

在你已經測試的情況下,鏈接到塊的返回值是完全無關緊要的,因爲它們只關心運行該塊需要多長時間。但是,正如可以在上面的示例中看到的,yield關鍵字可以被嵌入在其自身的(reverse_each do ... end)的塊,這意味着可以環繞它的其他行爲的每個給定的塊被稱爲時間:

1.times do 
    start_time = Time.now 
    yield 
    elapsed = Time.now - start_time 
end 

在這種情況下,需要返回times do ... end塊的值,以便您可以將給定塊的運行時間平均在一起,因此您需要找到一種方法將它們存儲在數組中,將它們平均到一起,然後將該平均值作爲您的measure方法的結果。請記住,您可以平均一個值來返回該值,因此對於單次運行和多次運行,您不需要不同的行爲。提示 - 您可以撥打n.times.map do ... end直接從times塊返回數組,而無需顯式實例化一個數組。

+0

在數組中存儲運行時間的解釋確實給我提供瞭解決方案。謝謝。 –