Το OpenStruct σου επιτρέπει να δημιουργήσεις εύκολα ένα αντικείμενο από ένα Hash.
Αντί να χρειάζεται να έχεις πρόσβαση μέσω των κλειδιών του Hash, το OpenStruct μάς επιτρέπει να χρησιμοποιούμε μεθόδους για να προσπελαύνουμε και να ορίζουμε τιμές.
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
Ένα επιπλέον πλεονέκτημα αυτής της προσέγγισης είναι ότι μπορούμε να εκμεταλλευτούμε μια συντόμευση όταν χρησιμοποιούμε σύνταξη μπλοκ.
Σε περιπτώσεις όπου ένα μπλοκ καλεί μία μόνο μέθοδο, μπορείς να αντικαταστήσεις το μπλοκ με &: ακολουθούμενο από το όνομα της μεθόδου.
Για παράδειγμα, αυτές οι δύο γραμμές είναι συνώνυμες:
people.sum { |person| person.age }
people.sum(&:age)
Όλες οι κλάσεις που έχεις δει σε προηγούμενες ασκήσεις ήταν μέρος της Core Library της Ruby.
Το OpenStruct είναι μέρος της Standard Library της Ruby (συχνά συντομεύεται σε "stdlib"), μιας συλλογής κλάσεων για την εργασία με πράγματα όπως ημερομηνίες, json και δικτύωση. Παρέχει επίσης χρήσιμες λειτουργίες που κάνουν τον κώδικά σου πιο εύκολο στη χρήση.
Όταν χρησιμοποιείς κλάσεις που δεν προέρχονται από την Core Library (τον δικό σου κώδικα σε διαφορετικά αρχεία, κλάσεις από τη stdlib ή εξωτερικές εξαρτήσεις), πρέπει να τις εισάγουμε με τη μέθοδο require πριν μπορέσουμε να τις χρησιμοποιήσουμε.
Για παράδειγμα:
require 'ostruct'
person = OpenStruct.new(name: "Jeremy Walker")
# ...
Συνεχίζεις να δουλεύεις στο σύστημα διαχείρισης αποθέματος που έφτιαξες προηγουμένως.
Αφού ανακάλυψες το OpenStruct και τις συντομεύσεις με block, αποφάσισες να αναδιαμορφώσεις λίγο τον κώδικα.
Αντί να αποθηκεύεις τα είδη ως hashes, θα αξιοποιήσεις τις νέες σου γνώσεις.
Θέλεις να συνεχίσεις να ανακτάς τη λίστα με τα είδη σε απόθεμα, αλλά αυτή τη φορά να είναι αντικείμενα στα οποία μπορείς να καλέσεις μεθόδους.
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
Αναδιαμόρφωσε την item_names ώστε να χρησιμοποιεί τη νέα σύντμηση με block που έμαθες, αντί για hashes.
Υπενθύμιση: η μέθοδος πρέπει να επιστρέφει:
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
Αναδιαμόρφωσε την total_stock ώστε να χρησιμοποιεί τη μέθοδο του OpenStruct, αντί να αναφέρεται σε ένα hash.
Υπενθύμιση: η μέθοδος πρέπει να επιστρέφει:
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
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Ruby με 21 έννοιες121 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.