Reduce / Inject
Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 23번째.
때때로 전체 배열을 단일 값, 합계, 곱, 또는 가장 긴 문자열로 축소해야 할 때가 있습니다. reduce(inject라고도 불림: 동일한 메서드, 두 개의 이름)가 바로 그 도구입니다.
이 블록은 누산기(accumulator)와 현재 요소(current element)라는 두 개의 매개변수를 받습니다. 블록의 반환 값은 다음 누산기가 됩니다.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n }
puts total # 10단계별로 누산기는 0 → 1 → 3 → 6 → 10입니다.
첫 번째 인수는 누산기(accumulator)의 시작 값입니다. 이를 생략하면, Ruby는 배열의 첫 번째 요소를 사용합니다:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24합계나 곱과 같은 순수 연산의 경우, Ruby는 블록 대신 심볼을 전달하는 단축 방법을 제공합니다:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24커스텀 어큐뮬레이터를 구축할 수 있게 되면, 단 한 번의 순회로 거의 모든 것을 계산할 수 있습니다.
챌린지
쉬움쉼표로 구분된 정수 목록을 읽습니다. 다음 세 줄을 출력하세요:
- 합계 (
reduce(:+)를 사용하세요) - 곱 (
reduce(:*)를 사용하세요) reduce와 명시적 블록을 사용하여 계산된 최댓값 (max를 사용하지 않습니다).
입력이 2,5,3,8인 경우, 출력은 다음과 같습니다:
18
240
8치트 시트
reduce (별칭: inject)는 배열을 단일 값으로 축소합니다. 블록은 누산기(accumulator)와 현재 요소를 전달받으며, 블록의 반환 값은 다음 누산기가 됩니다.
total = [1, 2, 3, 4].reduce(0) { |acc, n| acc + n } # 10시작 값을 생략하면 첫 번째 요소를 초기 누산기로 사용합니다:
[1, 2, 3, 4].reduce { |acc, n| acc * n } # 24간단한 연산을 위한 단축형으로 심볼을 전달할 수 있습니다:
[1, 2, 3, 4].reduce(:+) # 10
[1, 2, 3, 4].reduce(:*) # 24직접 해보기
numbers = gets.chomp.split(",").map(&:to_i)
# TODO: 합계, 곱, 최댓값을 출력하세요 (reduce와 명시적 블록 사용)
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
로직 및 흐름의 모든 레슨
5Enumerable의 강력한 기능
Select와 RejectMap 체이닝Reduce / Injectcount, all?, any?, none?group_by와 partitionsort_by, min_by, max_by요약 - 데이터 파이프라인