我目前正在进行Test First编程并且遇到位于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 :(得分:0)
到目前为止,您的方法基本上没问题,除非您不需要从i == 1
分出i > 1
- { 1.times { yield }
在功能上等同于只调用yield
。< / p>
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
块返回一个数组,而不必显式实例化。