2013-08-30 2 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를 호출 기능적으로 동일 { 1.times { yield } - 당신이 i == 1i > 1에서 밖으로 분기 할 필요가 없습니다 제외

답변

0

귀하의 방법은, 지금까지 대부분 괜찮습니다.

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 

을 연결된 블록의 반환 값은 블록을 실행하는 데 걸리는 시간에만 관심이 있기 때문에 중요하지 않습니다.

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

: 위의 예에서 볼 수 있듯이 단, yield 키워드는 당신이 그것을 주위에 주어진 블록을 호출 할 때마다 다른 동작을 포장 수 있다는 것을 의미 자신의 블록 (reverse_each do ... end)에 내장 될 수있다 이 경우 블록의 값을 반환하려면을 입력해야합니다. 따라서 주어진 블록의 런타임을 평균 할 수 있으므로 배열에 저장하고 평균을 구하여 평균을 구할 수있는 방법을 찾아야합니다. measure 메소드의 결과 단일 값을 평균하여 해당 값을 반환 할 수 있으므로 단일 실행과 다중 실행에 대해 다른 동작이 필요하지 않습니다. 힌트 - 을 호출하여 명시 적으로 인스턴스화 할 필요없이 times 블록에서 직접 배열을 반환 할 수 있습니다.

+0

배열에 런타임을 저장하는 것에 대한 설명은 실제로 해결책을 알려주었습니다. 고맙습니다. –

관련 문제