OpenStruct를 사용하면 Hash로 객체를 쉽게 만들 수 있어요.
Hash 키로 접근해야 하는 대신, OpenStruct에서는 메서드로 값에 접근하고 설정할 수 있어요.
attributes = { name: "Jeremy Walker", age: 21, location: "Nomadic" }
person = OpenStruct.new(attributes)
person.name
#=> Jeremy Walker
person.location
#=> Nomadic
# Update the age
person.age = 35
# It sets correctly
person.age
#=> 35
이 방식의 또 한 가지 장점은 블록 문법을 사용할 때 단축 표현을 활용할 수 있다는 점이에요.
블록이 메서드 하나만 호출하는 경우에는, 블록을 &: 뒤에 메서드 이름을 붙인 형태로 바꿀 수 있어요.
예를 들어, 다음 두 줄은 같은 의미예요:
people.sum { |person| person.age }
people.sum(&:age)
지금까지 연습 문제에서 본 모든 클래스는 Ruby의 코어 라이브러리에 속해 있었어요.
OpenStruct는 Ruby의 표준 라이브러리(흔히 "stdlib"라고 줄여 불러요)에 속해요. 날짜, JSON, 네트워킹 같은 것을 다루기 위한 클래스 모음이죠. 코드를 더 다루기 쉽게 만들어 주는 유용한 기능도 제공해요.
코어 라이브러리에 없는 클래스, 예를 들어 다른 파일에 있는 직접 작성한 코드나 stdlib의 클래스, 외부 의존성을 사용할 때는 require 메서드로 가져와야 사용할 수 있어요.
예를 들어:
require 'ostruct'
person = OpenStruct.new(name: "Jeremy Walker")
# ...
이전에 만든 재고 관리 시스템 작업을 계속하고 있어요.
OpenStruct와 블록 단축 문법을 알게 된 뒤로, 코드를 조금 리팩터링하기로 마음먹었어요.
항목을 해시로 저장하는 대신, 새로 익힌 기술을 활용해 볼 거예요.
재고에 있는 항목 목록은 계속 조회하고 싶은데, 이번에는 메서드를 호출할 수 있는 객체여야 해요.
inventory = BoutiqueInventory.new([
{price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
{price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
{price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
{price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
])
inventory.items.first.name
# => "Maxi Brown Dress"
inventory.items.first.price
# => 65
inventory.items.size
# => 4
item_names 리팩터링item_names를 해시 대신 새로 배운 블록 단축 문법을 사용하도록 리팩터링해요.
참고로, 이 메서드는 다음을 반환해야 해요.
BoutiqueInventory.new([
{price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
{price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
{price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
{price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).item_names
# => ["Bamboo Socks Cats", "Black Short Skirt", "Maxi Brown Dress", "Red Short Skirt"]
total_stock 리팩터링total_stock을 해시를 참조하는 대신 OpenStruct의 메서드를 사용하도록 리팩터링해요.
참고로, 이 메서드는 다음을 반환해야 해요.
BoutiqueInventory.new([
{price: 65.00, name: "Maxi Brown Dress", quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}},
{price: 50.00, name: "Red Short Skirt", quantity_by_size: {}},
{price: 29.99, name: "Black Short Skirt", quantity_by_size: {s: 1, xl: 4}},
{price: 20.00, name: "Bamboo Socks Cats", quantity_by_size: {s: 7, m: 2}}
]).total_stock
# => 36
Exercism에 가입하고 Ruby 트랙을 개념 21개연습 문제 121개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.