Η Crystal έχει αυτό που ονομάζουμε εκφράσεις ελέγχου. Αυτές χρησιμοποιούνται για να ελέγχουν τον τρόπο με τον οποίο θα τρέξει το πρόγραμμα και παίρνουν μια αληθή ή ψευδή τιμή. Υπάρχουν τελεστές που μπορούν να χρησιμοποιηθούν για να δημιουργήσουν αληθείς ή ψευδείς τιμές, αυτοί είναι γνωστοί ως τελεστές ισότητας και σύγκρισης.
Υπάρχουν δύο βασικές εκφράσεις ελέγχου που καθορίζουν ποιος κώδικας θα εκτελεστεί και ποιος όχι. Με άλλα λόγια, ποιος από τους κλάδους θα εκτελεστεί.
Αυτές οι δύο είναι: η if και η έκφραση unless.
Οι τελεστές σύγκρισης χρησιμοποιούνται για να συγκρίνουν τιμές και επιστρέφουν μια τιμή true ή false.
Αυτοί οι τελεστές απαιτούν δύο τιμές ίδιου τύπου για να συγκριθούν.
Αν οι τιμές δεν είναι ίδιου τύπου, τότε ο μεταγλωττιστής θα πετάξει ένα σφάλμα.
Ακολουθεί μια λίστα με τους τελεστές σύγκρισης και ένα παράδειγμα για το πότε δίνουν την τιμή true:
| Μέθοδος | Περιγραφή | Παράδειγμα |
|---|---|---|
| < | μικρότερο από | 4 < 5 |
| <= | μικρότερο ή ίσο με | 4 <= 4 |
| > | μεγαλύτερο από | 3 > 1 |
| >= | μεγαλύτερο ή ίσο με | 2 >= 2 |
Οι τελεστές ισότητας είναι παρόμοιοι με τους τελεστές σύγκρισης, αλλά χρησιμοποιούνται για να ελέγξουν αν δύο τιμές είναι ίσες ή όχι.
Ο τελεστής == ελέγχει αν δύο τιμές είναι ίσες, συμπεριλαμβανομένου του τύπου της τιμής.
Αν οι τιμές είναι ίδιες, τότε επιστρέφει true, αλλιώς επιστρέφει false.
Ο τελεστής == μπορεί να συγκρίνει οποιονδήποτε τύπο τιμής με οποιονδήποτε άλλο τύπο τιμής.
Ο != λειτουργεί με τον ίδιο τρόπο, αλλά επιστρέφει true αν οι τιμές δεν είναι ίσες και false αν είναι ίσες.
Η εντολή if χρησιμοποιείται για να ελέγξει αν μια δεδομένη συνθήκη είναι αληθής ή ψευδής.
Αν η συνθήκη είναι αληθής, τότε ο κώδικας μέσα στην εντολή if θα εκτελεστεί.
Μια εντολή if τελειώνει με τη λέξη-κλειδί end.
if 1 == 1
puts "1 is equal to 1"
end
# => 1 is equal to 1
if 1 > 2
puts "1 is greater than 2"
end
# => no output
Η εντολή unless λειτουργεί πολύ παρόμοια με την εντολή if, αλλά εκτελεί τον κώδικα μέσα στην εντολή unless αν η συνθήκη είναι ψευδής.
unless 1 == 1
puts "1 is not equal to 1"
end
# => no output
unless 1 > 2
puts "1 is not greater than 2"
end
# => 1 is not greater than 2
Η εντολή else μπορεί να χρησιμοποιηθεί μαζί με τις εντολές if και unless.
Η εντολή else θα εκτελεστεί αν ο κλάδος if ή ο κλάδος unless δεν εκτελεστεί.
Ακόμα κι αν ο κλάδος `else` μπορεί να χρησιμοποιηθεί μαζί με το `unless,`, αυτό δεν συνιστάται, γιατί βλάπτει την αναγνωσιμότητα.
Αντ' αυτού, συνιστάται η χρήση του `if !condition` με κλάδο else.
if 1 == 1
puts "1 is equal to 1"
else
puts "1 is not equal to 1"
end
# => 1 is equal to 1
unless 1 < 2
puts "1 is not greater than 2"
else
puts "1 is greater than 2"
end
# => 1 is greater than 2
Η εντολή elsif μπορεί να χρησιμοποιηθεί μαζί με την εντολή if.
Η εντολή elsif θα εκτελεστεί αν ο κλάδος if δεν εκτελεστεί και η συνθήκη της εντολής elsif είναι αληθής.
Οι εντολές elsif μπορούν να αλυσοδεθούν μεταξύ τους και θα εκτελεστεί η πρώτη αληθής συνθήκη.
Μπορεί επίσης να υπάρχει μια εντολή else στο τέλος της εντολής if, η οποία θα εκτελεστεί αν καμία από τις προηγούμενες εντολές δεν ήταν αληθής.
if 1 != 1
puts "1 is not equal to 1"
elsif 1 > 2
puts "1 is greater than 2"
else
puts "1 is not equal to 1 and 1 is not greater than 2"
end
# => 1 is not equal to 1 and 1 is not greater than 2
Όταν ανατίθεται σε διαφορετικούς τύπους, η μεταβλητή θα φέρει και τους δύο τύπους. Αυτό συμβαίνει επειδή ο μεταγλωττιστής δεν γνωρίζει ποιος κλάδος θα εκτελεστεί. Αυτή η πολλαπλή ανάθεση, γνωστή και ως ένωση, θα εξηγηθεί σε επόμενες έννοιες. Αυτό φαίνεται στο παρακάτω παράδειγμα:
if 1 == 1
a = 1
else
a = "1"
end
typeof(a) # => Int32 | String
Η Crystal έχει έναν τριαδικό τελεστή, μια εντολή if-else σε μία γραμμή: condition ? expression_if_truthy : expression_if_falsey
1 == 1 ? puts("1 is equal to 1") : puts("1 is not equal to 1")
# => 1 is equal to 1
Σε αυτή την άσκηση, θα αναπτύξουμε ένα απλό σύστημα ελέγχου για έναν πυρηνικό αντιδραστήρα.
Για να παράξει ο αντιδραστήρας ισχύ, πρέπει να βρίσκεται σε κατάσταση κρισιμότητας. Αν ο αντιδραστήρας βρίσκεται σε κατάσταση μικρότερη της κρισιμότητας, μπορεί να υποστεί ζημιά. Αν η κατάσταση του αντιδραστήρα ξεπεράσει την κρισιμότητα, μπορεί να υπερφορτωθεί και να οδηγήσει σε τήξη. Θέλουμε να μειώσουμε τις πιθανότητες τήξης και να διαχειριστούμε σωστά την κατάσταση του αντιδραστήρα.
Οι παρακάτω τρεις εργασίες σχετίζονται όλες με τη συγγραφή κώδικα για τη διατήρηση της ιδανικής κατάστασης του αντιδραστήρα.
Το πρώτο πράγμα που πρέπει να κάνει ένα σύστημα ελέγχου είναι να ελέγξει αν ο αντιδραστήρας βρίσκεται σε ισορροπία κρισιμότητας. Ένας αντιδραστήρας λέγεται ότι είναι κρίσιμος αν ικανοποιεί τις παρακάτω συνθήκες:
Υλοποίησε τη μέθοδο Reactor.criticality_balanced? που δέχεται ως παραμέτρους τη temperature, μετρημένη σε kelvin, και το neutrons_emitted, και επιστρέφει true αν ικανοποιούνται οι συνθήκες κρισιμότητας, false αν όχι.
Reactor.criticality_balanced?(750, 600)
# => true
Μόλις ο αντιδραστήρας αρχίσει να παράγει ισχύ, πρέπει να προσδιοριστεί η απόδοσή του. Η απόδοση μπορεί να ομαδοποιηθεί σε 4 ζώνες:
green -> απόδοση 80% ή περισσότερο,orange -> απόδοση μικρότερη από 80% αλλά τουλάχιστον 60%,red -> απόδοση κάτω από 60%, αλλά ακόμη 30% ή περισσότερο,black -> απόδοση μικρότερη του 30%.Η τιμή του ποσοστού μπορεί να υπολογιστεί ως (generated_power/theoretical_max_power)*100
όπου generated_power = voltage * current.
Σημείωσε ότι η τιμή του ποσοστού συνήθως δεν είναι ακέραιος αριθμός, οπότε φρόντισε να χρησιμοποιήσεις
σωστά τις συγκρίσεις < και <=.
Υλοποίησε τη μέθοδο Reactor.reactor_efficiency, με τρεις παραμέτρους: voltage, current και theoretical_max_power.
Αυτή η συνάρτηση θα πρέπει να επιστρέφει τη ζώνη απόδοσης του αντιδραστήρα : "green", "orange", "red" ή "black".
Reactor.reactor_efficiency(200,50,15000)
# => "orange"
Η τελευταία σου εργασία αφορά τη δημιουργία ενός μηχανισμού ασφαλείας για την αποφυγή υπερφόρτωσης και τήξης. Ο μηχανισμός αυτός θα καθορίζει αν ο αντιδραστήρας βρίσκεται κάτω, στο ή πάνω από το ιδανικό όριο κρισιμότητας. Η κρισιμότητα μπορεί τότε να αυξηθεί, να μειωθεί ή να σταματήσει με την εισαγωγή (ή την αφαίρεση) ράβδων ελέγχου στον αντιδραστήρα.
Υλοποίησε τη μέθοδο Reactor.fail_safe(), που δέχεται 3 παραμέτρους: τη temperature, μετρημένη σε kelvin, το neutrons_produced_per_second και το threshold, και επιστρέφει έναν κωδικό κατάστασης για τον αντιδραστήρα.
Αν temperature * neutrons_produced_per_second < 90% του threshold, επέστρεψε κωδικό κατάστασης "LOW"
που υποδεικνύει ότι πρέπει να αφαιρεθούν ράβδοι ελέγχου για να παραχθεί ισχύς.
Αν το temperature * neutrons_produced_per_second βρίσκεται εντός συν ή πλην 10% του threshold
ο αντιδραστήρας βρίσκεται σε κρισιμότητα και θα πρέπει να επιστραφεί ο κωδικός κατάστασης "NORMAL", που υποδεικνύει ότι ο
αντιδραστήρας βρίσκεται σε βέλτιστη κατάσταση και οι ράβδοι ελέγχου βρίσκονται σε ιδανική θέση.
Αν το temperature * neutrons_produced_per_second δεν βρίσκεται στα παραπάνω εύρη, ο αντιδραστήρας
οδηγείται σε τήξη και πρέπει να επιστραφεί ο κωδικός κατάστασης "DANGER" για να τερματιστεί αμέσως η λειτουργία του αντιδραστήρα.
temperature = 1000
neutrons_produced_per_second = 30
threshold = 5000
Reactor.fail_safe(temperature, neutrons_produced_per_second, threshold)
# => "DANGER"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.