을합니다. 제발, 저를 오해하지 마십시오. 몇 년 전에 Ruby를 시작했을 때 들었던 것을 반복하고 있습니다. Ruby를 배우는 것은 Ruby 구문을 사용하는 것 이상입니다. Ruby 코어를 탐색하고 Ruby 방식으로 작업 해보십시오.
이것은 정확히 여기서 발생합니다. 질문에 표시된 코드는 Ruby 방식과는 거리가 멀다. 또한 @manonthemat에 의해 주어진 답안의 코드도 있습니다.
def count_positives_sum_negatives(lst)
result = [0,0]
lst.each { |el| (el > 0) ? result[0] += 1 : result[1] += 1 }
result
end
또는 더 나은 :
단축 할 수있는 두 가지 경우 모두
def count_positives_sum_negatives(lst)
lst.each_with_object([0,0]) { |el,arr| (el > 0) ? arr[0] += 1 : arr[1] += 1 }
end
,
puts count_positives_sum_negatives([5,7,-1,-4,4,4,5,-3])
를 실행
[5,3]
,536 초래
each_with_object
을 사용하는 두 번째 형식은 첫 번째 형식보다 훨씬 좋습니다. 블록 내부에서 사용하기 위해 배열이나 해시를 선언하면 Ruby에서 코드 냄새로 간주됩니다.
나는 방법의 이름 (count_positives_sum_negatives
)이 좋지 않다는 것을 지적하고 싶습니다. 이 방법은 포지티브와 네거티브를 모두 계산하고 그 중 아무 것도 합하지 않기 때문에 메서드가 수행하는 작업을 나타내지는 않습니다. 확실히 count_positives_and_negatives
은 더 나은 이름입니다.
한편, @manonthemat는 범위를 기준으로 인덱스를 반복하는 것보다 each
을 사용하는 것이 훨씬 낫다는 것을 지적하면서 완전히 옳습니다. 블록에 실제로 색인이 필요한 경우이를 제공하는 방법은 each_with_index
입니다.
색인이 하나 씩 꺼져 있습니다 (내 대답 참조). – manonthemat
이 방법은 긍정과 부정을 계산합니다. 그것은 네거티브를 합하지 않습니다. 'count_positives_sum_negatives'라고하는 이유는 무엇입니까? 호기심, 알았지? –
@Aetherus는 당신에게 최고의 "Ruby way"대답을주었습니다. 그걸 사용하십시오. – moveson