Τα διαστήματα αντιπροσωπεύουν ένα διάστημα ανάμεσα σε δύο τιμές.
Οι πιο συνηθισμένοι τύποι που υποστηρίζουν διαστήματα είναι οι Integer και String.
Μπορούν να χρησιμοποιηθούν για πολλά πράγματα, όπως η γρήγορη δημιουργία μιας συλλογής, ο τεμαχισμός συμβολοσειρών, ο έλεγχος αν μια τιμή βρίσκεται σε ένα διάστημα και η επανάληψη.
Δημιουργούνται χρησιμοποιώντας τον τελεστή διαστήματος .. ή ... (συμπεριληπτικό και αποκλειστικό, αντίστοιχα).
1..5 # => 1..5
1...5 # => 1...5
(1..5).to_a # => [1, 2, 3, 4, 5]
(1...5).to_a # => [1, 2, 3, 4]
Ο λόγος που υπάρχουν δύο τελεστές διαστήματος είναι για να μπορείς να δημιουργείς διαστήματα που συμπεριλαμβάνουν ή εξαιρούν την τελική τιμή, κάτι που μπορεί να είναι χρήσιμο όταν, για παράδειγμα, δουλεύεις με θέσεις που ξεκινούν από το μηδέν.
Τα διαστήματα μπορούν επίσης να δημιουργηθούν χρησιμοποιώντας τον αρχικοποιητή Range.
Range.new(1, 5) # A range containing 1, 2, 3, 4, 5
Όταν δημιουργείς ένα διάστημα στη Ruby χρησιμοποιώντας τους τελεστές διαστήματος .. ή ... και θέλεις να καλέσεις μια μέθοδο πάνω στο διάστημα, πρέπει να βάλεις το διάστημα μέσα σε παρενθέσεις.
Αυτό συμβαίνει γιατί αλλιώς η μέθοδος θα κληθεί στο δεύτερο όρισμα του τελεστή διαστήματος.
(1..5).sum # => 15
1..5.sum # => Error: undefined method `sum' for 5:Integer (NoMethodError)
Όταν θέλεις να τεμαχίσεις μια συμβολοσειρά, μπορείς να χρησιμοποιήσεις τον τελεστή διαστήματος για να πάρεις μια υποσυμβολοσειρά. Δηλαδή, δημιουργώντας ένα διάστημα με τη θέση αρχής και τέλους της υποσυμβολοσειράς.
"Hello World"[0..4] # => "Hello"
"Hello World"[6..10] # => "World"
Μπορείς επίσης να χρησιμοποιήσεις αρνητικές θέσεις για να πάρεις την υποσυμβολοσειρά από το τέλος της συμβολοσειράς.
"Hello World"[-5..-1] # => "World"
"Hello World"[6..-4] # => "Wo"
Τα διαστήματα έχουν ένα σύνολο μεθόδων που μπορούν να χρησιμοποιηθούν για να δουλέψεις μαζί τους. Για παράδειγμα, αυτές οι μέθοδοι μπορούν να χρησιμοποιηθούν για να πάρεις το άθροισμα όλων των τιμών στο διάστημα ή να ελέγξεις αν το διάστημα περιλαμβάνει μια τιμή.
| Μέθοδος | Περιγραφή | Παράδειγμα |
|---|---|---|
sum |
Επιστρέφει το άθροισμα όλων των τιμών στο διάστημα | (1..5).sum # => 15 |
size |
Επιστρέφει το μέγεθος του διαστήματος | (1..5).size # => 5 |
include? |
Επιστρέφει true αν το διάστημα περιλαμβάνει τη δεδομένη τιμή, αλλιώς false
|
(1..5).include?(3) # => true |
Ένα διάστημα μπορεί να είναι χωρίς τέλος ή χωρίς αρχή.
Το διάστημα χωρίς τέλος ή χωρίς αρχή έχει ως τιμή αρχής ή τέλους το nil, αλλά όταν ορίζεις το διάστημα το nil μπορεί να παραλειφθεί.
Η χρήση διαστημάτων χωρίς αρχή και χωρίς τέλος είναι χρήσιμη όταν θέλεις, για παράδειγμα, να τεμαχίσεις μια συμβολοσειρά από την αρχή ή μέχρι το τέλος.
"Hello World"[0..] # => "Hello World"
"Hello World"[4..] # => "o World"
"Hello World"[..5] # => "Hello "
Αν δεν χρησιμοποιηθεί σε μια συλλογή, το διάστημα χωρίς τέλος μπορεί να προκαλέσει μια ατελείωτη ακολουθία, αν δεν χρησιμοποιηθεί με προσοχή.
Οι συμβολοσειρές μπορούν επίσης να χρησιμοποιηθούν σε διαστήματα και σου επιτρέπουν να πάρεις ένα διάστημα συμβολοσειρών ανάμεσα σε δύο συμβολοσειρές. Η συμπεριφορά τους μπορεί να είναι λίγο απρόσμενη με ορισμένες συμβολοσειρές, οπότε χρησιμοποίησέ το με προσοχή.
"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]
Η Ruby σου επιτρέπει να χρησιμοποιείς προσαρμοσμένα αντικείμενα σε διαστήματα. Η προϋπόθεση για αυτό είναι το αντικείμενο να υλοποιεί τα εξής:
Comparable
succ
<=>
Αυτές οι μέθοδοι κάνουν το διάστημα να μπορεί να διατρέχει το αντικείμενο και να συγκρίνει τα αντικείμενα μέσα στο διάστημα.
class Foo
include Comparable
attr_reader :value
def initialize(value)
@value = value
end
def succ
Foo.new(value + 1)
end
def <=>(other)
value <=> other.value
end
end
(Foo.new(1)..Foo.new(5))
# => #<Foo:0x7f3552bebe70 @value=1>, #<Foo:0x7f3552bebe50 @value=2>, #<Foo:0x7f3552bebe40 @value=3>, #<Foo:0x7f3552bebe30 @value=4>, #<Foo:0x7f3552bebe20 @value=5>