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 语句返回的内容时遇到了问题。如果有人能引导我完成解决这个问题的过程,我将不胜感激,以便我理解解决方案。

4

1 回答 1

0

到目前为止,您的方法大部分都可以,除非您不需要从 - 分支出来i == 1-i > 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,而无需显式实例化一个。

于 2013-08-30T19:21:12.520 回答