Στη Ruby, οι πίνακες είναι διατεταγμένες συλλογές οποιουδήποτε αντικειμένου, με ακέραιες θέσεις.
Η αρίθμηση των θέσεων ενός πίνακα ξεκινά από το 0.
Μια αρνητική θέση θεωρείται ότι μετράει από το τέλος του πίνακα. Για παράδειγμα, η θέση -1 δείχνει το τελευταίο στοιχείο του πίνακα, η -2 είναι το προτελευταίο στοιχείο του πίνακα, και ούτω καθεξής.
Οι πίνακες συνήθως δημιουργούνται με τον συμβολισμό [].
Μπορούν να περιέχουν αντικείμενα οποιουδήποτε τύπου.
array = [1, "two", 3.0]
Τα στοιχεία ενός πίνακα μπορούν να ανακτηθούν με τις θέσεις τους χρησιμοποιώντας τη μέθοδο #[].
Αυτή επιστρέφει το στοιχείο στη συγκεκριμένη θέση ή επιστρέφει έναν υποπίνακα που ξεκινά από τη θέση εκκίνησης και συνεχίζει για ένα καθορισμένο μήκος.
Οι αρνητικές θέσεις μετρούν προς τα πίσω από το τέλος του πίνακα.
a = [ "a", "b", "c", "d", "e" ]
a[2] #=> "c"
a[6] #=> nil
a[1, 3] #=> [ "b", "c", "d" ]
a[-1] #=> "e"
a[-2] #=> "d"
a[-3, 2] #=> ["c", "d"]
Υπάρχουν πολλές χρήσιμες βοηθητικές μέθοδοι για τους πίνακες. Ορίστε μερικές από τις πιο συνηθισμένες:
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.size #=> 8
fibonacci.sum #=> 33
fibonacci.reverse #=> [13, 8, 5, 3, 2, 1, 1, 0]
Αντί να χρησιμοποιούμε βρόχους για να διατρέξουμε συλλογές, στη Ruby χρησιμοποιούμε απαρίθμηση.
Η απαρίθμηση είναι η διαδικασία να διατρέχουμε μια συλλογή (εδώ έναν πίνακα) και να εκτελούμε κάποια ενέργεια σε κάθε αντικείμενο. Η απαρίθμηση είναι βασική έννοια στη Ruby και χρησιμοποιείται για πράγματα όπως ταξινόμηση, ομαδοποίηση, mapping, reducing και πολλά άλλα.
Μια απαρίθμηση που τυπώνει κάθε λέξη ενός πίνακα θα έμοιαζε κάπως έτσι:
words = ["the", "cat", "sat"]
words.each do |word|
puts word
end
# Output:
# the
# cat
# sat
Σε αυτό το παράδειγμα, καλέσαμε τη μέθοδο .each στον πίνακα μας και της περάσαμε ένα μπλοκ που δέχεται μία παράμετρο (word) και την τυπώνει.
Θα δούμε τα μπλοκ πολύ πιο αναλυτικά αργότερα στο track, αλλά για την ώρα σκέψου τα σαν ανώνυμες συναρτήσεις που μπορούν να δέχονται μηδέν ή περισσότερα ορίσματα.
Μπορούν να οριστούν με τη σύνταξη do...end (πάνω) ή με τη σύνταξη {} (κάτω).
Ορίστε μερικά ακόμη παραδείγματα μεθόδων πινάκων που χρησιμοποιούν μπλοκ:
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13]
fibonacci.count { |number| number == 1 } #=> 2
fibonacci.any? { |number| number == 6 } #=> false
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]
Είσαι ένας φανατικός παρατηρητής πουλιών που παρακολουθείς πόσα πουλιά έχουν επισκεφτεί τον κήπο σου τις τελευταίες επτά ημέρες.
Έχεις πέντε εργασίες, όλες σχετικές με τον αριθμό των πουλιών που επισκέφτηκαν τον κήπο σου.
Για λόγους σύγκρισης, κρατάς πάντα δίπλα σου ένα αντίγραφο από τις μετρήσεις της προηγούμενης εβδομάδας, οι οποίες ήταν: 0, 2, 5, 3, 7, 8 και 4. Υλοποίησε τη μέθοδο BirdCount.last_week που επιστρέφει τις μετρήσεις της προηγούμενης εβδομάδας:
BirdCount.last_week
# => [0, 2, 5, 3, 7, 8, 4]
Υλοποίησε τη μέθοδο BirdCount#yesterday ώστε να επιστρέφει πόσα πουλιά επισκέφτηκαν τον κήπο σου χθες. Οι μετρήσεις των πουλιών είναι ταξινομημένες ανά ημέρα, με το πρώτο στοιχείο να είναι η μέτρηση της παλαιότερης ημέρας και το τελευταίο στοιχείο να είναι η σημερινή μέτρηση.
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.yesterday
# => 4
Υλοποίησε τη μέθοδο BirdCount#total ώστε να επιστρέφει τον συνολικό αριθμό των πουλιών που έχουν επισκεφτεί τον κήπο σου:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.total
# => 19
Κάποιες ημέρες είναι πιο πολυάσχολες από άλλες. Μια πολυάσχολη ημέρα είναι εκείνη κατά την οποία πέντε ή περισσότερα πουλιά έχουν επισκεφτεί τον κήπο σου.
Υλοποίησε τη μέθοδο BirdCount#busy_days ώστε να επιστρέφει τον αριθμό των πολυάσχολων ημερών:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.busy_days
# => 2
Υλοποίησε τη μέθοδο BirdCount#day_without_birds? που επιστρέφει true αν υπήρξε κάποια ημέρα κατά την οποία μηδέν πουλιά επισκέφτηκαν τον κήπο. Διαφορετικά, επιστρέφει false:
birds_per_day = [2, 5, 0, 7, 4, 1]
bird_count = BirdCount.new(birds_per_day)
bird_count.day_without_birds?
# => true
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Ruby με 21 έννοιες121 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.