OpenStruct te permite crear un objeto a partir de un Hash con facilidad.
En lugar de tener que acceder mediante 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 añadida de este planteamiento es que podemos aprovechar un atajo cuando usamos la sintaxis de bloque.
Cuando un bloque llama a un único método, puedes sustituir el bloque por &: 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 incluye algunas funcionalidades útiles para que tu código sea más fácil de manejar.
Cuando usamos clases que no son de la biblioteca principal (tu propio código en otros archivos, clases de la biblioteca estándar o dependencias externas), tenemos que 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 stock que creaste anteriormente.
Desde que descubriste OpenStruct y los atajos de bloque, has decidido refactorizar un poco el código.
En lugar de almacenar los artículos como hashes, vas a aprovechar tus nuevas habilidades.
Quieres seguir obteniendo el array de artículos en stock, 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 has aprendido 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 de 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.