루비를 가장 잘 활용하는 5가지 예
루비로 무엇을 할 수 있는지 궁금한 적이 있으신가요? 글쎄요, 아마도 하늘이 한계일 것입니다만, 어느 정도 알려진 몇 가지 사례에 대해 이야기하게 되어 기쁩니다...
루비 전문가가 작성한 글을 읽고 해시를 항상 사용할 필요가 없는 이유를 알아보세요.
어떤 자료를 집계하고 싶을 때 우리는 종종 #each_with_object
또는 일반 loop 사용 #with_object
. 하지만 대부분의 경우 루비 개발자 가 일반 해시를 애그리게이터로 사용하고 있다면 괜찮을 수도 있지만, 이 글에서는 항상 해시일 필요는 없다는 것을 보여드리고자 합니다.
모든 파일이 하나의 디렉터리에 배치되어 있다고 가정합니다(사람들
).
다음과 같은 상황이 있다고 가정해 보겠습니다. 사람들/사람들.csv
file:
이름, 성, 나이
John,Doe,24
Jane,Dee,45
조쉬,비,55
안드레아,보야,34
앤드류,무어,54
총 행 수와 평균 연령을 구하려면 다음 스크립트를 작성할 수 있습니다:
people/parser.rb
'csv' 필요
aggregated = CSV.foreach('people.csv', headers: true)
.withobject({ total: 0, totalage: 0 }) do |row, agg|
agg[:total] += 1
agg[:totalage] += row['Age'].toi
end
total = aggregated[:total]
averageage = aggregated[:totalage].to_f / total
puts "총: #{총계}"
puts "평균 연령: #{평균_연령}"
그리고 예, 그것은 일을하지만 그런 것을 읽습니다. 코드 는 의심스러운 즐거움입니다. 너무 낮은 수준인 것 같습니다. 전용 애그리게이터를 제공함으로써 이 문제를 개선할 수 있습니다. loop.
people/age_aggregator.rb
나이 집계자 클래스
어트리뷰터 :합계, :총계
def initialize
총계 = 0
총_연령 = 0
end
def increment!
총 += 1
end
def incrementage!(age)
총액 += 나이
end
def averageage
totalage.to_f / total
end
end
그러면 루프는 아래와 같이 표시됩니다:
people/parser.rb
require 'csv'
필수 './ageaggregator.rb'
aggregated = CSV.foreach('people.csv', headers: true)
.withobject(AgeAggregator.new) do |row, agg|
agg.increment!
agg.incrementage!(row['Age'].to_i)
end
puts "총계: #{aggregated.total}"
puts "평균 연령: #{aggregated.average_age}"
훨씬 더 명확해진 것 같아요.
더 많은 코드를 작성했지만 하위 수준의 세부 사항은 별도의 클래스로 추출했습니다. 이제 메인 스크립트가 훨씬 더 잘 읽힙니다.
물론 이 예제가 너무 간단해서 리팩터링에 그렇게 많은 노력을 기울일 필요가 없다고 주장할 수도 있지만, 그냥 예시일 뿐이니까요.) 더 많은 데이터를 집계해야 하는 경우에는 이러한 집계기 객체가 정말 유용한 방법입니다.
자세히 읽어보세요: