OpenStruct permet de créer facilement un objet à partir d'un Hash.
Plutôt que d'y accéder par les clés du Hash, OpenStruct nous permet d'utiliser des méthodes pour lire et définir les valeurs.
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 avantage de cette approche est qu'on peut profiter d'un raccourci quand on utilise la syntaxe de bloc.
Quand un bloc appelle une seule méthode, tu peux remplacer le bloc par &: suivi du nom de la méthode.
Par exemple, ces deux lignes sont équivalentes :
people.sum { |person| person.age }
people.sum(&:age)
Toutes les classes que tu as vues dans les exercices précédents font partie de la bibliothèque de base de Ruby.
OpenStruct fait partie de la bibliothèque standard de Ruby (souvent abrégée en « stdlib ») : un ensemble de classes pour travailler avec des choses comme les dates, le JSON ou la mise en réseau.
Elle propose aussi des fonctionnalités utiles pour rendre ton code plus facile à manipuler.
Quand on utilise des classes qui ne viennent pas de la bibliothèque de base (ton propre code dans d'autres fichiers, des classes de la bibliothèque standard ou des dépendances externes), il faut les importer avec la méthode require avant de pouvoir s'en servir.
Par exemple :
require 'ostruct'
person = OpenStruct.new(name: "Jeremy Walker")
# ...
Tu continues de travailler sur le système de gestion des stocks que tu as construit précédemment.
Depuis que tu as découvert OpenStruct et les raccourcis de bloc, tu as décidé de réécrire un peu le code.
Plutôt que de stocker les articles sous forme de hashes, tu vas mettre à profit tes nouvelles compétences.
Tu veux continuer à récupérer la liste des articles en stock, mais cette fois ils doivent être des objets sur lesquels on peut appeler des méthodes.
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
Réécris item_names pour utiliser le nouveau raccourci de bloc que tu as appris plutôt que des hashes.
Pour rappel, la méthode doit renvoyer :
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
Réécris total_stock pour utiliser la méthode de l'OpenStruct plutôt que de référencer un hash.
Pour rappel, la méthode doit renvoyer :
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
Inscris-toi sur Exercism pour apprendre et maîtriser Ruby avec 21 concepts121 exercices, et un vrai mentorat humain, le tout gratuitement.