Υπάρχουν βασικά δύο τύποι βρόχων:
Και οι δύο είναι εφικτοί στη Julia, αν και ο δεύτερος μπορεί να είναι πιο συνηθισμένος.
while
Για προβλήματα ανοιχτού τύπου, όπου ο αριθμός των περασμάτων από τον βρόχο δεν είναι γνωστός εκ των προτέρων, η Julia έχει τον βρόχο while.
Η βασική μορφή είναι αρκετά απλή:
while condition
do_something()
end
Σε αυτή την περίπτωση, το πρόγραμμα θα συνεχίζει να εκτελεί τον βρόχο μέχρι η condition να μην είναι πλέον true.
Υπάρχουν δύο τρόποι να βγεις νωρίς από τον βρόχο:
break προκαλεί την έξοδο από τον βρόχο, με την εκτέλεση να συνεχίζεται στην επόμενη γραμμή μετά το end του βρόχου.return x σταματά την εκτέλεση της τρέχουσας συνάρτησης, περνώντας την τιμή επιστροφής x πίσω στον καλούντα.Με αυτές τις επιλογές διαθέσιμες, μερικές φορές μπορεί να είναι βολικό να δημιουργήσεις έναν "άπειρο" βρόχο με while true ... end και μετά να βασιστείς στο να βρεις μια συνθήκη τερματισμού μέσα στο σώμα του βρόχου, ώστε να ενεργοποιήσεις ένα break ή ένα return.
Το πιο απλό παράδειγμα είναι η επανάληψη πάνω από ένα εύρος.
Αν θέλουμε να κάνουμε κάτι 10 φορές:
for n in 1:10
do_something(n)
end
Αν η τρέχουσα επανάληψη δεν ικανοποιεί κάποια συνθήκη, μπορείς να περάσεις αμέσως στην επόμενη επανάληψη με ένα continue:
for n in 1:10
if is_useless(n)
continue
end
# we decided this iteration could be useful
do_something_slow(n)
end
Σε συντομότερη μορφή, το μπλοκ if θα μπορούσε να αντικατασταθεί από το is_useless(n) && continue.
Μπορείς να κάνεις επανάληψη πάνω από πολλούς άλλους τύπους συλλογών: στοιχεία σε έναν πίνακα, χαρακτήρες σε μια συμβολοσειρά, κλειδιά σε ένα λεξικό...
Η προϋπόθεση είναι ότι η συλλογή πρέπει να είναι iterable.
Αυτό θα εξηγηθεί με περισσότερες λεπτομέρειες σε μια επόμενη Έννοια, αλλά στην ουσία η συλλογή πρέπει να έχει τρόπο να αποδώσει το επόμενο στοιχείο όταν της ζητηθεί, καθώς και τρόπο να δείξει ότι έφτασε στο τέλος και δεν υπάρχουν άλλα στοιχεία.
Τα παραδείγματα μέχρι τώρα κάνουν επανάληψη πάνω από το εύρος 1:10, όπου η τιμή είναι ταυτόχρονα και η θέση στον βρόχο.
Γενικότερα, μπορεί να χρειαστείς τη θέση και όχι μόνο την τιμή.
Για αυτό, χρησιμοποιείται η συνάρτηση eachindex(), για παράδειγμα for i in eachindex(my_array) ... end.
Το να γράφεις ρητούς βρόχους είναι συνήθως λιγότερο συνηθισμένο στη Julia απ' ό,τι σε πολλές παραδοσιακές γλώσσες, επειδή υπάρχουν διάφορες πιο συνοπτικές επιλογές.
Μια ιδιαίτερα συνηθισμένη περίπτωση είναι όταν χρειάζεται να φτιάξουμε ένα νέο διάνυσμα από τα στοιχεία κάποιας άλλης συλλογής (διάνυσμα, συμβολοσειρά, σύνολο ... υπάρχουν πολλές δυνατότητες).
Όποιος συμπαθεί τις κατανοήσεις λιστών στην Python θα χαρεί να μάθει ότι η Julia μπορεί να χρησιμοποιήσει παρόμοια σύνταξη.
Η ουσία είναι να στήσεις έναν πολύ συμπαγή βρόχο μέσα σε ένα διάνυσμα.
Η πιο απλή σύνταξη έχει τη μορφή result = [f(x) for x in some_collection].
Με έναν παραδοσιακό βρόχο, αυτό θα μπορούσε να γραφτεί:
result = []
for x in some_collection
push!(result, f(x))
end
Προαιρετικά, μπορεί να προστεθεί μια συνθήκη στο τέλος, ώστε να επιλέγονται μόνο τα στοιχεία της συλλογής που ταιριάζουν:
# multiples of 3
julia> [n^2 for n in 1:10 if n%3 == 0]
3-element Vector{Int64}:
9
36
81
# letters beyond 'h' in the alphabet
julia> [uppercase(c) for c in "Julia" if c > 'h']
3-element Vector{Char}:
'U': ASCII/Unicode U+0055 (category Lu: Letter, uppercase)
'L': ASCII/Unicode U+004C (category Lu: Letter, uppercase)
'I': ASCII/Unicode U+0049 (category Lu: Letter, uppercase)
Η σύνταξη είναι παρόμοια με της Python, αλλά όχι ίδια. Υπάρχει κάποια απόκλιση για πολλαπλές μεταβλητές ή/και πολυδιάστατους πίνακες, οπότε αυτό το θέμα θα καλυφθεί με περισσότερες λεπτομέρειες σε μια επόμενη Έννοια.
Ως σύγχρονη γλώσσα, ως επί το πλείστον συναρτησιακή, η Julia έχει (φυσικά) ποικίλους τρόπους να χειρίζεται συλλογές, όχι μόνο έναν ρητό βρόχο ή έναν συμπαγή βρόχο μέσα σε μια κατανόηση.
Οι επόμενες Έννοιες θα εξετάσουν εναλλακτικές όπως το broadcasting και τις συναρτήσεις ανώτερης τάξης.