Διαδρομές
/
Ruby
Ruby
/
Ύλη
/
Διαστήματα
Δι

Διαστήματα σε Ruby

1 άσκηση

Σχετικά με την έννοια Διαστήματα

Τα διαστήματα αντιπροσωπεύουν ένα διάστημα ανάμεσα σε δύο τιμές. Οι πιο συνηθισμένοι τύποι που υποστηρίζουν διαστήματα είναι οι 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
Note

Όταν δημιουργείς ένα διάστημα στη 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 "
Caution

Αν δεν χρησιμοποιηθεί σε μια συλλογή, το διάστημα χωρίς τέλος μπορεί να προκαλέσει μια ατελείωτη ακολουθία, αν δεν χρησιμοποιηθεί με προσοχή.

Διαστήματα συμβολοσειρών

Οι συμβολοσειρές μπορούν επίσης να χρησιμοποιηθούν σε διαστήματα και σου επιτρέπουν να πάρεις ένα διάστημα συμβολοσειρών ανάμεσα σε δύο συμβολοσειρές. Η συμπεριφορά τους μπορεί να είναι λίγο απρόσμενη με ορισμένες συμβολοσειρές, οπότε χρησιμοποίησέ το με προσοχή.

"aa".."az".to_a # => ["aa", "ab", "ac", ..., "az"]

Προσαρμοσμένα αντικείμενα σε διαστήματα

Advanced

Η 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>
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Διαστήματα