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 вправа та справжнє наставництво від людей, і все це безкоштовно.