OpenStruct ti permette di creare facilmente un oggetto da un Hash.
Invece di dover accedere usando le chiavi di Hash, OpenStruct ci permette di usare metodi per accedere e impostare i valori.
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
Un vantaggio di questo approccio è che possiamo sfruttare una scorciatoia quando usiamo la sintassi con i blocchi.
Quando un blocco chiama un singolo metodo, puoi sostituire il blocco con &: seguito dal nome del metodo.
Per esempio, queste due righe sono sinonime:
people.sum { |person| person.age }
people.sum(&:age)
Tutte le classi che hai visto negli esercizi precedenti facevano parte della libreria core di Ruby.
OpenStruct fa parte della libreria standard di Ruby (spesso abbreviata in «stdlib»): una raccolta di classi per lavorare con cose come date, JSON e networking. Fornisce anche alcune funzionalità utili per rendere il codice più facile da usare.
Quando usi classi che non provengono dalla libreria core (codice in file diversi, classi della stdlib o dipendenze esterne), dobbiamo importarle usando il metodo require prima di poterle usare.
Per esempio:
require 'ostruct'
person = OpenStruct.new(name: "Jeremy Walker")
# ...
Continui a lavorare sul sistema di gestione del magazzino che hai costruito in precedenza.
Dopo aver scoperto OpenStruct e le scorciatoie di blocco, hai deciso di riorganizzare un po' il codice.
Invece di memorizzare gli articoli come hash, metterai a frutto le tue nuove competenze.
Vuoi continuare a recuperare l'elenco degli articoli in magazzino, ma questa volta devono essere oggetti su cui poter chiamare dei metodi.
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
Riorganizza item_names in modo che usi la nuova scorciatoia di blocco che hai imparato, invece degli hash.
Come promemoria, il metodo deve restituire:
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
Riorganizza total_stock in modo che usi il metodo di OpenStruct, invece di fare riferimento a un hash.
Come promemoria, il metodo deve restituire:
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
Iscriviti a Exercism per imparare e padroneggiare Ruby con 21 concetti121 esercizi e il mentoring di persone reali, tutto gratis.