Η Crystal έχει έναν τύπο που ονομάζεται Nil, ο οποίος μπορεί να έχει μόνο μία τιμή: nil.
Χρησιμοποιείται για να αναπαραστήσει την απουσία τιμής και είναι παρόμοιος με null ή None σε άλλες γλώσσες.
Τιμές Nil μπορούν να επιστραφούν από διάφορες μεθόδους, για παράδειγμα από τη μέθοδο String#[]?, η οποία επιστρέφει nil αν η θέση είναι εκτός ορίων.
"foo"[10]? # => nil
Η Crystal διαθέτει αυτό που είναι γνωστό ως ΕΛΕΓΧΟΥΣ ΜΗΔΕΝΙΚΩΝ ΑΝΑΦΟΡΩΝ, που σημαίνει ότι όλοι οι τύποι δεν μπορούν να πάρουν την τιμή nil από προεπιλογή.
Αυτό σημαίνει ότι δεν μπορείς να αναθέσεις nil σε μια μεταβλητή, εκτός αν τη δηλώσεις ρητά ως τύπο Nil.
Με τη σειρά του, αυτό σημαίνει ότι ο μεταγλωττιστής θα ελέγχει αυτόματα για μηδενικές αναφορές.
Μπορείς να χειριστείς τις τιμές nil με διάφορους τρόπους.
Το nil είναι μια ψευδής τιμή, όπως και το false.
Αυτό σημαίνει ότι σε εντολές και άλλα σημεία όπου αναμένεται μια ψευδής ή αληθής τιμή, θα αντιμετωπίζεται το ίδιο όπως το false.
if nil
puts "nil is truthy"
else
puts "nil is falsey"
end
# => nil is falsey
Αυτό σημαίνει ότι ο κλάδος που αξιολογείται ως αληθής δεν θα εκτελεστεί αν μια μεταβλητή που μπορεί να είναι nil έχει την τιμή nil.
foo = "boo"[2]? # It is possible that foo is nil
if foo
p foo.class # => Char
end
nil
Η Crystal διαθέτει μια μέθοδο που μπορεί να χρησιμοποιηθεί για να ελέγξεις αν μια τιμή είναι nil.
Ονομάζεται nil? και είναι διαθέσιμη σε όλα τα αντικείμενα.
foo = "boo"[2]?
if foo.nil?
puts "foo is nil"
else
puts "foo is not nil"
end
Αυτό είναι λίγο διαφορετικό όταν χρησιμοποιείς απλώς την τιμή σε μια εντολή if, καθώς στα προηγούμενα παραδείγματα τόσο το false όσο και το nil θα αντιμετωπίζονταν ως ψευδή.
Εδώ, μόνο το nil αντιμετωπίζεται ως ψευδής τιμή, αφού αν ήταν false δεν θα ήταν nil, οπότε θα ήταν αληθής τιμή.
Ο ευκολότερος τρόπος για να χειριστείς τιμές nil είναι να διασφαλίσεις ότι δεν θα γίνουν ποτέ nil εξαρχής.
Ο τελεστής ή (||) χρησιμοποιείται συχνά όταν έχεις να κάνεις με Bools, αλλά αν τον κατανοήσεις σωστά, μπορεί επίσης να χρησιμοποιηθεί για τον χειρισμό τιμών nil.
Ο τελεστής ή ελέγχει αν η πρώτη τιμή αξιολογείται ως αληθής. Αν όχι, χρησιμοποιείται η δεύτερη τιμή.
Αυτό μπορεί να χρησιμοποιηθεί ώστε αν η τιμή είναι nil να αξιολογείται ως ψευδής και έτσι να χρησιμοποιηθεί η δεύτερη τιμή.
"foo"[10]? || "bar" # => "bar"
Η Μεγαλειότητά σου διοργανώνει ένα δείπνο στην πρωτεύουσα της Ένωσης του Κάλμαρ, την Κοπεγχάγη. Είναι το μεγαλύτερο πάρτι της χρονιάς και όλοι οι ευγενείς είναι καλεσμένοι. Όμως φήμες διαδίδονται σε όλη τη χώρα ότι υπάρχει σχέδιο να δηλητηριαστεί η Μεγαλειότητά σου.
Η Μεγαλειότητά της ζήτησε από εσένα, τον βασιλικό ανιχνευτή δηλητηρίων, να ανακαλύψεις αν κάποιο φαγητό ή ποτό είναι δηλητηριασμένο. Η Μεγαλειότητά σου σχεδιάζει να σερβίρει μόνο Mushroom pasties ως φαγητό, αλλά από ποτά υπάρχει μεγάλη ποικιλία.
Υπάρχει μεγάλη πιθανότητα το φαγητό να είναι δηλητηριασμένο αν δεν είναι αυτό που παρήγγειλε η Μεγαλειότητά της. Αν το φαγητό δεν είναι αυτό που παρήγγειλε η Μεγαλειότητά της, θα πρέπει να πεταχτεί.
Υλοποίησε τη μέθοδο check_food?, η οποία δέχεται το όρισμα food, που περιέχει το όνομα του φαγητού ως String.
Η μέθοδος θα πρέπει να επιστρέφει το φαγητό αν είναι Mushroom pasties, αλλιώς θα πρέπει να επιστρέφει nil.
CastleDinner.check_food?("Mushroom pasties")
# => "Mushroom pasties"
CastleDinner.check_food?("Bread")
# => nil
Είναι πιθανό το ποτό να είναι δηλητηριασμένο, αλλά είναι λίγο πιο δύσκολο να καταλάβεις αν είναι.
Το ποτό είναι δηλητηριασμένο αν δεν περιέχει το γράμμα i στο όνομά του, δεν έχει σημασία αν είναι πεζό ή κεφαλαίο.
Το ποτό θα πρέπει να πεταχτεί αν είναι δηλητηριασμένο.
Υλοποίησε τη μέθοδο check_drink?, η οποία δέχεται το όρισμα drink, που περιέχει το όνομα του ποτού ως String.
Η μέθοδος θα πρέπει να επιστρέφει το ποτό αν δεν είναι δηλητηριασμένο, αλλιώς θα πρέπει να επιστρέφει nil.
CastleDinner.check_drink?("Apple juice")
# => "Apple juice"
CastleDinner.check_drink?("Tea")
# => nil
Η Μεγαλειότητά σου δεν θα ήθελε να ανησυχήσει τους καλεσμένους της για δηλητήριο στο φαγητό τους. Επομένως, αν το ποτό είναι δηλητηριασμένο, θα πρέπει να αντικατασταθεί με ένα νέο ποτό, συγκεκριμένα Apple juice.
Υλοποίησε τη μέθοδο replace_drink, η οποία δέχεται το όρισμα drink, που περιέχει το όνομα του ποτού ως String.
Η μέθοδος θα πρέπει να επιστρέφει το ποτό αν δεν είναι δηλητηριασμένο, αλλιώς θα πρέπει να επιστρέφει "Apple juice".
CastleDinner.replace_drink("Orange juice")
# => "Orange juice"
CastleDinner.replace_drink("Tea")
# => "Apple juice"
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Crystal με 26 έννοιες142 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.