2016-09-17 4 views
2

경찰이 있습니다 : RuboCop::Cop::Lint::NextWithoutAccumulator입니다.`reduce`에 accumulator 인자로`next` 사용

누구든지이 경찰이 무엇인지 설명 할 수 있습니다. 어떻게 코드를 개선해야합니까?

가독성, 효율성이 향상 되었습니까?

github code. 콘솔에서이 작업을 시도 할 경우

# bad 
result = (1..4).reduce(0) do |acc, i| 
    next if i.odd? 
    acc + i 
end 

, 당신은 nil 개체에 대한 NoMethodError 예외를 얻을 것이다 :

+0

링크 된 경찰의 문서에서 두 가지 예를 실행하려 했습니까? –

+0

@muistooshort 나에게 수치 스럽다. (나는 늦은 저녁에이 급한 질문을 적어도 조금이라도 받아들이기를 바랍니다. –

답변

6

이 문서의 예제 코드를 고려할 수 있습니다. 이는 개체가 지정되지 않은 경우 nextnil을 반환하기 때문입니다. 이터레이터는 return으로 처리 할 수 ​​있습니다.

reduce method의 경우 블록에서 반환되는 값이 필요하므로 예기치 않은 동작이 발생할 수 있습니다. i이 홀수 인 경우 next이 계산되고 결과로 nil이 제공됩니다. 다음 반복기에서 accnil과 같으며 정수를 더할 수 없습니다. 이 예제에서 첫 번째 반복은 i = 1이고, next은 블록의 결과로 acc에서 nil으로 설정합니다.

어떤 경우에는 열거 가능 값에 대해 올바른 값을 얻을 수 있지만 일반적으로 next 값을 지정하는 것이 더 안전합니다.

+0

자세한 대답을 주셔서 감사합니다! –

+0

이것은 질문에 답하지는 않지만, 문제가 해결되지 않았을 수 있습니다. (주제를 벗어나 의견을 요하는) 바운드. –