2010-05-28 2 views
14

Ruby를 사용하여 Project Euler 문제를 해결하기 위해 4 가지 루핑 방법, for 루프, 시간, 범위 및 최대 방법을 사용했지만 times 메서드는 예상 된 답변, for-loop, range 및 upto 메소드는 그렇지 않습니다. 나는 그것들이 어느 정도 같다고 생각하지만, 그렇지 않다는 것을 알았다. 누군가이 방법 들간의 차이점을 설명해 줄 수 있습니까?범위 대 시간을 사용하여 Ruby의 루핑 차이점

여기에이 정보가 쉽게 문서를 검사하여 얻을 수 있습니다 내가

# for-loop method 
for n in 0..1 
    puts n 
end 

0 
1 
=> 0..1 

# times method 
2.times do |n| 
    puts n 
end 

0 
1 
=> 2 

# range method 
(0..1).each do |n| 
    puts n 
end 

0 
1 
=> 0..1 

# upto method 
0.upto(1) do |n| 
    puts n 
end 

0 
1 
=> 0 

답변

6

사용되는 루프 구조입니다.

Array#eacharray.each {|item| block } → array의 서명이, 그래서 우리는 foo.each { ... }의 반환 값이 foo 것을 볼 수 있습니다.

마찬가지로 Int#upto의 서명은 int.upto(limit) {|i| block } => int이므로 x.upto(y) { ... }은 항상 x을 반환합니다.

우리는 Integer#times의 서명 때문에 2.times { ... }이 2를 반환한다는 것을 알 수 있습니다. 당신을위한-루프가 .each 루프 같은 일을 반환 이유가 그래서

나는 문제가 바로 문서를 찾는 데

하지만 for x in y...y.each do |x| ...로 변환됩니다.

어쨌든 에 따라 돌아 오는 값은 이상한 접근 방식입니다. 나는 이것이 관용적 인 루비 코드에서 많이 발생하지 않는다고 생각한다.

+0

그는 반환 값에 대해 묻는 것처럼 들리지 않습니다. – sepp2k

+0

@ sepp2k : 각 문장의 * 출력 *은 '0 1'이고, '=>'으로 표시된 반환 값은 3 개의 다른 값을 가짐을 보았습니다. 어쨌든이 질문은 더 명확하게 말할 수 있습니다. –

+0

흠, 아마도 맞을 것입니다. – sepp2k

3

정확하게 이해했다면, 왜 n.times이 반복되는 유일한 방법인지 묻는 것입니다. 그러나 은 포함되지 않습니다. 그것은 간단

범위의 경우 :이 경우는 x..y X로부터 Y에 포함 된 범위를 정의하고 x...y는 X로부터 Y 단독의 범위를 정의한다. 따라서 시간과 동일한 동작을 원하면 0...n을 사용하십시오.

x.upto(y)의 경우 y을 포함하여 최대 한 번 반복됩니다. 이것은 단순히 개개인이 어떻게 정의되고 문서화되어 작동되는지입니다.

n.times에 n이 포함되지 않은 이유도 분명합니다. 0에서 n까지 반복하면 n+1 번이됩니다. 그러나이 방법은 n.times이므로 분명히 n 번만 산출해야합니다.