Ο βρόχος είναι μια δομή ελέγχου που επιτρέπει σε κώδικα να εκτελείται ξανά και ξανά, με βάση μια συνθήκη.
while
Ο βρόχος while είναι μια δομή ελέγχου που επιτρέπει σε κώδικα να εκτελείται ξανά και ξανά, με βάση μια συνθήκη.
Ο κώδικας μέσα σε έναν βρόχο while συνεχίζει να εκτελείται όσο η συνθήκη αποτιμάται ως truthy.
Οι βρόχοι while χρησιμοποιούνται συχνά όταν δεν ξέρεις από πριν πόσες επαναλήψεις θα χρειαστούν, αλλά μπορείς να τους χρησιμοποιήσεις όπου χρειάζεσαι βρόχο.
Η συνθήκη αποτιμάται πριν εκτελεστεί ο κώδικας μέσα στον βρόχο. Αυτό σημαίνει ότι, αν η συνθήκη είναι ψευδής, ο κώδικας μέσα στον βρόχο δεν θα εκτελεστεί ποτέ.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Όταν θέλεις να διατρέξεις μια συμβολοσειρά, μπορείς να κάνεις βρόχο με βάση το μήκος της.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
until
Οι until βρόχοι λειτουργούν όπως οι βρόχοι while, με τη διαφορά ότι ο κώδικας μέσα στον βρόχο συνεχίζει να εκτελείται μέχρι η συνθήκη να αποτιμηθεί ως truthy.
Είναι η ίδια διαφορά που υπάρχει ανάμεσα στο if και στο unless.
i = 0
until i == 3
puts i
i += 1
end
Ένα συχνό σφάλμα με τους βρόχους while είναι να μπεις σε έναν "ατέρμονο βρόχο", από τον οποίο δεν βγαίνεις ποτέ.
Ένας ατέρμονος βρόχος μπορεί να προκληθεί από μια συνθήκη που δεν αποτιμάται ποτέ ως truthy ή falsey.
Αυτό συνήθως οφείλεται σε λάθος του προγραμματιστή, για παράδειγμα όταν ξεχνάς να αυξήσεις τη μεταβλητή του βρόχου.
Μερικές φορές όμως, ο ατέρμονος βρόχος είναι ο πιο ξεκάθαρος τρόπος να υλοποιήσεις τη λογική του προγράμματος.
Ή μπορεί να είναι απαραίτητο ο βρόχος να τρέχει για πάντα. Για παράδειγμα, ένας διακομιστής HTTP περιμένει μια εισερχόμενη σύνδεση, την εξυπηρετεί και μετά περιμένει την επόμενη.
breakΜε τη λέξη-κλειδί break μπορείς να βγεις νωρίτερα από έναν βρόχο.
Αυτό είναι βολικό όταν θέλεις να βγεις νωρίτερα από έναν βρόχο κάτω από ορισμένες συνθήκες.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
nextΜε τη λέξη-κλειδί next μπορείς να προχωρήσεις κατευθείαν στην επόμενη επανάληψη ενός βρόχου.
Αυτό είναι βολικό όταν θέλεις να παραλείψεις συγκεκριμένες επαναλήψεις ενός βρόχου.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
Ο τύπος μιας μεταβλητής μπορεί να διαφέρει μέσα σε έναν βρόχο.
Στο παρακάτω παράδειγμα, ο τύπος της a είναι Int32 | String, επειδή στο πρώτο μέρος του βρόχου μπορεί να είναι Int32 ή String.
Η μεταβλητή a έχει τον τύπο Int32 | String μόνο στο πρώτο μέρος του βρόχου, αφού όταν ξεκινά ο βρόχος περιέχει Int32 και στη δεύτερη επανάληψη περιέχει String.
Θα εξηγήσουμε αναλυτικά αυτό το σύστημα πολλαπλών τύπων αργότερα.
Επειδή όμως είμαστε σίγουροι ότι στο δεύτερο μέρος του βρόχου θα περιέχει μόνο String, ο τύπος της a είναι String στο δεύτερο μέρος του βρόχου.
Κατά την εκτέλεση, δεν θα περιέχει ποτέ ταυτόχρονα Int32 και String.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
while ως έκφρασηΤο while μπορεί να χρησιμοποιηθεί ως έκφραση, δηλαδή ως η τιμή μιας μεταβλητής.
Η τιμή που επιστρέφεται είναι αυτή που δίνεις με τη λέξη-κλειδί break.
Δεν επιστρέφει την τιμή της τελευταίας έκφρασης μέσα στον βρόχο.
a = while true
break 1
end
p a
# => 1
i = 0
a = while i == 0
i += 1
1
end
p a
# => nil