Menu
Coddy logo textTech

병합 및 변환

Coddy Ruby 여정의 로직 및 흐름 섹션에 포함된 레슨 — 56개 중 36번째.

해시를 다룰 때 두 가지 연산이 매우 자주 발생하여 Ruby는 이들에게 전용 메서드를 제공합니다.

merge는 두 개의 해시를 합쳐서 새로운 해시를 만듭니다. 두 해시가 동일한 키를 가지고 있을 때는 오른쪽의 값이 우선합니다:

defaults = { color: "red", size: "M" }
custom   = { size: "L" }
settings = defaults.merge(custom)
puts settings.inspect   # {color: "red", size: "L"}

원본 중 어느 것도 수정되지 않으며, merge는 새로운 해시를 반환합니다.

transform_values는 동일한 키를 유지하면서 각 값을 블록에 전달하여 처리한 새로운 해시를 만듭니다:

prices = { apple: 1, bread: 3 }
with_tax = prices.transform_values { |p| p * 1.2 }
puts with_tax.inspect   # {apple: 1.2, bread: 3.6}

그리고 transform_keys는 키에 대해 동일한 작업을 수행하며, 문자열을 심볼로 변환하거나 대소문자를 정규화할 때 유용합니다:

{ "a" => 1, "B" => 2 }.transform_keys(&:upcase)
# {"A"=>1, "B"=>2}
challenge icon

챌린지

중급

두 개의 장바구니 해시 mondaytuesday가 주어집니다. 각 해시는 문자열 아이템 이름을 정수 수량에 매핑합니다. 상점은 정규화된 이틀간의 합계를 원합니다.

다음 단계를 거쳐 하나의 최종 해시를 생성하세요:

  1. 두 해시를 블록과 함께 merge하여, 양쪽에 모두 존재하는 키의 수량이 덮어씌워지지 않고 합산되도록 합니다.
  2. 결과에 transform_keys(&:to_sym)를 적용하여 키를 심볼로 변환합니다.
  3. transform_values를 사용하여 10% 대량 구매 할인을 적용합니다. 모든 수량은 정수 연산을 사용하여 (qty * 9 / 10)이 됩니다.

최종 해시를 inspect를 사용하여 출력하세요.

기본 데이터에 대한 출력 결과는 다음과 같습니다:

{:apples=>9, :bread=>4, :milk=>5, :cheese=>1}

(Apples: 5 + 5 = 10, 이후 9. Bread: 3 + 2 = 5, 이후 4. Milk: 월요일에만 6 → 5. Cheese: 화요일에만 2 → 1.)

치트 시트

merge는 두 개의 해시를 결합합니다. 키가 충돌할 경우, 오른쪽 해시의 값이 우선합니다:

defaults = { color: "red", size: "M" }
custom   = { size: "L" }
settings = defaults.merge(custom)
# {color: "red", size: "L"}

중복된 키를 수동으로 처리하려면 merge에 블록을 전달하세요:

a.merge(b) { |key, old_val, new_val| old_val + new_val }

transform_values는 각 값을 블록에 전달하여 처리한 결과로 새로운 해시를 반환합니다:

prices = { apple: 1, bread: 3 }
prices.transform_values { |p| p * 1.2 }
# {apple: 1.2, bread: 3.6}

transform_keys는 키에 대해 동일한 작업을 수행합니다:

{ "a" => 1 }.transform_keys(&:upcase)  # {"A"=>1}
{ "a" => 1 }.transform_keys(&:to_sym)  # {a: 1}

직접 해보기

monday  = { "apples" => 5, "bread" => 3, "milk" => 6 }
tuesday = { "apples" => 5, "bread" => 2, "cheese" => 2 }

# TODO: 중복되는 키를 합산하기 위해 merge-with-block을 사용하고, 키를 심볼화한 다음,
#       모든 값에 * 9 / 10을 적용하고, 결과를 확인합니다.
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

로직 및 흐름의 모든 레슨