Μια Tuple μοιάζει αρκετά με έναν Vector (έναν array μίας διάστασης) σε πολλά σημεία.
Ωστόσο, υπάρχουν μερικές σημαντικές διαφορές.
( ) αντί για αγκύλες [ ], αν και οι παρενθέσεις μπορούν να παραλειφθούν σε περιπτώσεις όπου το νόημα είναι σαφές.Η αμεταβλητότητα επιτρέπει περισσότερες βελτιστοποιήσεις από τον μεταγλωττιστή και κάνει τις πλειάδες πιο αποδοτικές από τα διανύσματα, οπότε αξίζει να προτιμώνται σε περιπτώσεις όπου η μεταβλητότητα δεν είναι απαραίτητη.
julia> t = (3, 5.2, "xyz")
(3, 5.2, "xyz")
# Non-homogeneous:
julia> dump(t)
Tuple{Int64, Float64, String}
1: Int64 3
2: Float64 5.2
3: String "xyz"
julia> t[2]
5.2
# Immutable:
julia> t[2] = 7.3
ERROR: MethodError: no method matching setindex!(::Tuple{Int64, Float64, String})
Υπάρχει επίσης ένας κατασκευαστής Tuple(), που μετατρέπει οποιαδήποτε συλλογή που μπορεί να διατραπεί σε πλειάδα.
Βολικά, αυτό αντιμετωπίζει τη συμβολοσειρά ως συλλογή χαρακτήρων που μπορεί να διατραπεί.
julia> Tuple("Julia")
('J', 'u', 'l', 'i', 'a')
Σε οποιαδήποτε πλειάδα, μπορείς να έχεις πρόσβαση στα στοιχεία με τη θέση τους ή να τα διατρέξεις με έναν βρόχο.
Οποιαδήποτε καθαρά αριθμητική πλειάδα μπορεί επίσης να χρησιμοποιηθεί σε μαθηματικές συναρτήσεις όπως η sum(), ακριβώς όπως οι πίνακες.
Μια πλειάδα μπορεί να αποσυσκευαστεί σε μεμονωμένα στοιχεία με πολλαπλή ανάθεση.
Για στοιχεία που δεν χρειάζεσαι, χρησιμοποίησε την κάτω παύλα _ ως μεταβλητή-οδηγό.
julia> tup = (1, "Julia", true)
(1, "Julia", true)
julia> num, name, _ = tup
(1, "Julia", true)
julia> uppercase(name), 2num
("JULIA", 2)
Οι προγραμματιστές Python θα είναι πολύ εξοικειωμένοι με αυτή τη σύνταξη πολλαπλής ανάθεσης.
Μια Tuple περιέχει μόνο τιμές.
Μια NamedTuple αντιστοιχίζει κάθε τιμή με ένα όνομα.
Στη συνέχεια μπορείς να έχεις πρόσβαση σε κάθε πεδίο ξεχωριστά με τον συμβολισμό της τελείας:
julia> nt = (a = 1, b = 7.3)
(a = 1, b = 7.3)
julia> dump(nt)
@NamedTuple{a::Int64, b::Float64}
a: Int64 1
b: Float64 7.3
julia> nt.b
7.3
Το όνομα αποθηκεύεται εσωτερικά ως Symbol (ένας αμετάβλητος τύπος, με πρόθεμα άνω και κάτω τελεία :), οπότε υπάρχει διαθέσιμος και ένας εναλλακτικός συμβολισμός:
julia> nt[:b]
7.3
Είναι εύκολο να πάρεις ξεχωριστά είτε τα ονόματα (που ονομάζονται και "κλειδιά") είτε τις τιμές:
julia> nt
(a = 1, b = 7.3)
julia> keys(nt)
(:a, :b)
julia> values(nt)
(1, 7.3)
Σημείωσε ότι η επανάληψη πάνω σε μια ονομαστική πλειάδα παράγει μόνο τις τιμές, και τα ονόματα αγνοούνται.
Οι πλειάδες (ονομαστικές ή μη) είναι ένας πολύ συνηθισμένος τρόπος για να μεταφέρεις δομημένα δεδομένα από και προς συναρτήσεις. Η αμεταβλητότητα είναι καλή σε αυτή την περίπτωση χρήσης, καθώς παρέχει ασφάλεια δεδομένων και επιτρέπει πιο επιθετικές βελτιστοποιήσεις από τον μεταγλωττιστή.
Οι Azara και Rui είναι συμπαίκτες σε ένα κυνήγι θησαυρού με πειρατικό θέμα. Ο ένας έχει μια λίστα με θησαυρούς και τις συντεταγμένες τους στον χάρτη, και ο άλλος μια λίστα με ονόματα τοποθεσιών και τις συντεταγμένες τους στον χάρτη. Τους έχουν δώσει επίσης κενούς χάρτες με ένα σημείο εκκίνησης που σημειώνεται ως ΕΙΣΑΙ ΕΔΩ.
| Η λίστα της Azara | Η λίστα του Rui | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
Τα πράγματα όμως είναι λίγο ανοργάνωτα: οι συντεταγμένες της Azara φαίνεται να έχουν διαφορετική μορφή και σειρά από του Rui, και πρέπει να κοιτούν συνεχώς από τη μια λίστα στην άλλη για να καταλάβουν ποιοι θησαυροί πάνε με ποιες τοποθεσίες. Καθώς είναι αρχάριοι προγραμματιστές Julia, ήρθαν σε σένα για βοήθεια, ώστε να γράψουν ένα μικρό πρόγραμμα (βασικά, ένα σύνολο από συναρτήσεις) που θα οργανώσει καλύτερα τις πληροφορίες του κυνηγιού τους.
Υλοποίησε τη συνάρτηση get_cooordinate() που παίρνει ένα ζεύγος (treasure, coordinate) από τη λίστα της Azara και επιστρέφει μόνο τη συντεταγμένη του χάρτη που εξάγεται.
julia> get_cooordinate( ("Scrimshaw Whale's Tooth", "2A") )
"2A"
Υλοποίησε τη συνάρτηση convert_coordinate() που παίρνει μια συντεταγμένη στη μορφή "2A" και επιστρέφει μια πλειάδα στη μορφή ('2', 'A').
julia> convert_coordinate("2A")
('2', 'A')
Υλοποίησε τη συνάρτηση compare_records() που παίρνει ένα ζεύγος (treasure, coordinate) και μια καταγραφή (location, coordinate, quadrant) και συγκρίνει τις συντεταγμένες τους.
Επίστρεψε true αν οι συντεταγμένες "ταιριάζουν", και επίστρεψε false αν δεν ταιριάζουν.
Μορφοποίησε ξανά τις συντεταγμένες όπως χρειάζεται για σωστή σύγκριση.
julia> compare_records(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "blue"))
false
julia> compare_records(("Model Ship in Large Bottle", "8A"), ("Harbor Managers Office", ('8', 'A'), "purple"))
true
Υλοποίησε τη συνάρτηση create_record() που παίρνει ένα ζεύγος (treasure, coordinate) από τη λίστα της Azara και μια καταγραφή (location, coordinate, quadrant) από τη λίστα του Rui και επιστρέφει (coordinate, location, quadrant, treasure) αν οι συντεταγμένες ταιριάζουν.
Αν οι συντεταγμένες δεν ταιριάζουν, επίστρεψε μια κενή πλειάδα. Μορφοποίησε ξανά τις συντεταγμένες όπως χρειάζεται για σωστή σύγκριση.
julia> create_record(("Brass Spyglass", "4B"), ("Abandoned Lighthouse", ('4', 'B'), "Blue"))
("4B", "Abandoned Lighthouse", "Blue", "Brass Spyglass")
julia> create_record(("Brass Spyglass", "4B"), ("Seaside Cottages", ('1', 'C'), "Blue"))
()
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Julia με 35 έννοιες128 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.