Στο Bird Count γνώρισες τις μεθόδους απαρίθμησης count, any?, select, all? και map.
Ας τα ανακεφαλαιώσουμε, προσθέτοντας και μερικά επιπλέον:
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.count { |number| number == 1 } #=> 2
fibonacci.any? { |number| number > 20 } #=> false
fibonacci.none? { |number| number > 20 } #=> true
fibonacci.select { |number| number.odd? } #=> [1, 1, 3, 5, 13]
fibonacci.all? { |number| number < 20 } #=> true
fibonacci.map { |number| number * 2 } #=> [0, 2, 2, 4, 6, 10, 16, 26]
fibonacci.select { |number| number >= 5 } #=> [5, 8, 13]
fibonacci.find { |number| number >= 6 } #=> 8
# Some methods work with or without a block
fibonacci.sum #=> 33
fibonacci.sum { |number| number * number } #=> 273
# There are also methods to help with nested arrays:
animals = [ ['cat', 'bob'], ['horse', 'caris'], ['mouse', 'arya'] ]
animals.flatten #=> ["cat", "bob", "horse", "caris", "mouse", "arya"]
Hash
Η απαρίθμηση αντικειμένων Hash είναι ακριβώς ίδια με την απαρίθμηση αντικειμένων Array, με τη διαφορά ότι το μπλοκ δέχεται δύο ορίσματα: το κλειδί και την τιμή:
pet_names = {cat: "bob", horse: "caris", mouse: "arya"}
pet_names.each { |animal, name| ... }
Αν χρειάζεσαι μόνο μία από τις τιμές, μπορείς να χρησιμοποιήσεις το ειδικό σύμβολο _ για να δηλώσεις ότι η μία τιμή δεν χρειάζεται.
Αυτό βοηθά τόσο στη σαφήνεια για τον προγραμματιστή όσο και στην απόδοση.
pet_names = {cat: "bob", horse: "caris", mouse: "arya"}
pet_names.map { |_, name| name } #=> ["bob", "caris", "arya"]
Μπορείς επίσης να απαριθμήσεις μέσα σε εμφωλευμένα μπλοκ και να ενώσεις μεθόδους σε αλυσίδα.
Για παράδειγμα, αν έχουμε έναν πίνακα από αντικείμενα Hash με ζώα και θέλουμε να εξαγάγουμε τα ζώα με κοντά ονόματα, θα μπορούσαμε να κάνουμε κάτι σαν αυτό:
pets = [
{ animal: "cats", names: ["bob", "fred", "sandra"] },
{ animal: "horses", names: ["caris", "black beard", "speedy"] },
{ animal: "mice", names: ["arya", "jerry"] }
]
pets.map { |pet|
pet[:names].select { |name| name.length <= 5 }
}.flatten.sort
#=> ["arya", "bob", "caris", "fred", "jerry"]
Διαχειρίζεσαι ένα διαδικτυακό κατάστημα μόδας. Η μεγάλη ετήσια έκπτωση πλησιάζει, οπότε θέλεις να φτιάξεις κάποιες λειτουργίες που θα σε βοηθήσουν να κάνεις απογραφή του αποθέματός σου και να βεβαιωθείς ότι είσαι έτοιμος.
Κάθε μεμονωμένο είδος του αποθέματος αναπαρίσταται από ένα hash, και ολόκληρο το απόθεμα είναι ένας πίνακας από αυτά τα hash.
[
{
name: "White Shirt",
price: 40,
quantity_by_size: {s: 3, m: 7, l: 8, xl: 4}
},
{ ... }
]
Υλοποίησε τη μέθοδο BoutiqueInventory.item_names, η οποία πρέπει να επιστρέφει μια λίστα με τα ονόματα των ειδών σε αλφαβητική σειρά.
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"]
Υλοποίησε τη μέθοδο BoutiqueInventory.cheap που πρέπει να επιστρέφει όποια είδη κοστίζουν λιγότερο από $30.
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}}
]).cheap
# => [
# {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}}
# ]
Υλοποίησε τη μέθοδο BoutiqueInventory.out_of_stock που πρέπει να επιστρέφει όποια είδη δεν έχουν απόθεμα (όπου το quantity_by_size είναι κενό).
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}}
]).out_of_stock
#=> [{price: 50.00, name: "Red Short Skirt", quantity_by_size: {}}]
Υλοποίησε τη μέθοδο BoutiqueInventory.stock_for_item(name) για να επιστρέφει το απόθεμα ενός είδους με βάση το όνομά του:
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}}
]).stock_for_item("Black Short Skirt")
#=> {s: 1, xl: 4}
Υλοποίησε τη μέθοδο BoutiqueInventory.total_stock για να υπολογίσεις το συνολικό πλήθος των ειδών στην αποθήκη σου:
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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.