OpenStruct te permite crear un objeto a partir de un Hash con facilidad.
En lugar de tener que acceder usando las claves del Hash, OpenStruct nos permite usar métodos para acceder a los valores y establecerlos.
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
Una ventaja adicional de este enfoque es que podemos aprovechar un atajo cuando usamos la sintaxis de bloque.
Cuando un bloque llama a un solo método, puedes reemplazar el bloque con &: seguido del nombre del método.
Por ejemplo, estas dos líneas son sinónimas:
people.sum { |person| person.age }
people.sum(&:age)
Todas las clases que has visto en los ejercicios anteriores forman parte de la Biblioteca Principal de Ruby.
OpenStruct forma parte de la Biblioteca Estándar de Ruby (a menudo abreviada como «stdlib»), una colección de clases para trabajar con cosas como fechas, json y redes. También ofrece algunas funcionalidades útiles para que tu código sea más fácil de manejar.
Cuando usas clases que no son de la Biblioteca Principal (tu propio código en otros archivos, clases de la stdlib o dependencias externas), necesitamos importarlas con el método require antes de poder usarlas.
Por ejemplo:
require 'ostruct'
person = OpenStruct.new(name: "Jeremy Walker")
# ...
Sigues trabajando en el sistema de gestión de inventario que construiste antes.
Desde que descubriste OpenStruct y los atajos de bloque, decidiste refactorizar un poco el código.
En lugar de guardar los artículos como hashes, vas a aprovechar tus nuevas habilidades.
Quieres seguir recuperando la lista de artículos en inventario, pero esta vez deben ser objetos a los que se les puedan llamar 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
Refactoriza item_names para que use el nuevo atajo de bloque que aprendiste en lugar de hashes.
Como recordatorio, el método debe 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
Refactoriza total_stock para que use el método del OpenStruct en lugar de referenciar un hash.
Como recordatorio, el método debe 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
Regístrate en Exercism para aprender y dominar Ruby con 21 conceptos121 ejercicios y mentoría humana real, todo gratis.