O OpenStruct permite-te criar facilmente um objeto a partir de um Hash.
Em vez de teres de aceder através das chaves de um Hash, o OpenStruct permite-nos usar métodos para aceder e definir valores.
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
Uma vantagem desta abordagem é podermos tirar partido de um atalho ao usar a sintaxe de bloco.
Nas situações em que um bloco chama um único método, podes substituir o bloco por &: seguido do nome do método.
Por exemplo, estas duas linhas são sinónimas:
people.sum { |person| person.age }
people.sum(&:age)
Todas as classes que viste nos exercícios anteriores fazem parte da Biblioteca Principal do Ruby.
O OpenStruct faz parte da Biblioteca Padrão do Ruby (muitas vezes abreviada para "stdlib"), uma coleção de classes para trabalhar com coisas como datas, json e redes. Também disponibiliza algumas funcionalidades úteis que tornam o teu código mais fácil de trabalhar.
Quando usas classes que não vêm da Biblioteca Principal, sejam o teu próprio código em ficheiros diferentes, classes da stdlib ou dependências externas, precisas de as importar com o método require antes de as poderes usar.
Por exemplo:
require 'ostruct'
person = OpenStruct.new(name: "Jeremy Walker")
# ...
Continuas a trabalhar no sistema de gestão de stock que construíste anteriormente.
Depois de descobrires o OpenStruct e os atalhos de blocos, decidiste refatorar um pouco o código.
Em vez de guardares os artigos como hashes, vais aproveitar as competências que acabaste de adquirir.
Queres continuar a obter a lista de artigos em stock, mas desta vez devem ser objetos aos quais podes chamar métodos.
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
Refatora o item_names para usares o novo atalho de bloco que aprendeste, em vez de hashes.
Como lembrete, o método deve devolver:
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
Refatora o total_stock para usares o método do OpenStruct, em vez de referenciar um hash.
Como lembrete, o método deve devolver:
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
Inscreve-te no Exercism para aprenderes e dominares Ruby com 21 conceitos121 exercícios, e mentoria humana real, tudo grátis.