DedSec Project

crystal — συγκεντρωτικός οδηγός — DedSec Project

crystal — συγκεντρωτικός οδηγός Crystal Έννοια Η Crystal μεταγλωττίζει γλώσσα με σύνταξη τύπου Ruby σε native κώδικα, με type inference και έλεγχο nilable values. Παράδειγμα πηγαίου κώδικα…

Crystal

Έννοια

Η Crystal μεταγλωττίζει γλώσσα με σύνταξη τύπου Ruby σε native κώδικα, με type inference και έλεγχο nilable values.

Παράδειγμα πηγαίου κώδικα ή χρήσης

numbers = [1, 2, 3]
puts numbers.sum

Άσκηση με συγκεκριμένο στόχο

Υπολόγισε το άθροισμα και δοκίμασε lookup που μπορεί να επιστρέψει nil· έλεγξε το πριν από χρήση.

Έλεγχος και διάγνωση

Τα Ruby gems και Crystal shards δεν είναι εναλλάξιμα· η ομοιότητα σύνταξης δεν σημαίνει ABI συμβατότητα.

Σημείωσε την είσοδο, το αναμενόμενο αποτέλεσμα και το πραγματικό αποτέλεσμα στην εγκατεστημένη έκδοση της Crystal. Αν ο κώδικας δεν είναι προσβάσιμος από το κινητό, κράτησε το παράδειγμα ως μη δοκιμασμένο και εξήγησε τη σημασιολογία αντί να ισχυριστείς επιτυχία. Κάνε μια δεύτερη δοκιμή που απομονώνει μόνο τον μηχανισμό της άσκησης και κράτησε ακριβές σφάλμα με τρόπο που να μην εκθέτει προσωπικά δεδομένα.

Crystal — Αναλυτικός οδηγός εξάσκησης

Μετασχηματισμός τυποποιημένων τιμών

Η Crystal μοιάζει συντακτικά με Ruby, αλλά μεταγλωττίζεται και ελέγχει τύπους πριν την εκτέλεση. Αποθήκευσε ως scores.cr:

scores = [1, nil, 3] of Int32?
doubled = scores.compact_map { |n| n.try { |value| value * 2 } }
raise "wrong result" unless doubled == [2, 6]
puts doubled.join(",")

Αναμένεται 2,6. Ο τύπος Int32? επιτρέπει ακέραιο ή Nil. Η try εκτελεί το block μόνο για μη-nil τιμή και η compact_map αφαιρεί τα nil αποτελέσματα. Δοκίμασε crystal run scores.cr και σημείωσε την έκδοση compiler. Η συμπεριφορά δεν ταυτίζεται αυτομάτως με αυτή της Ruby, επειδή η Crystal έχει διαφορετική στατική ανάλυση.

Σκόπιμο σφάλμα μεταγλώττισης

Άλλαξε value * 2 σε value + "two". Η ανάμειξη αριθμού και string χωρίς κατάλληλη πράξη πρέπει να απορριφθεί. Κατέγραψε το πραγματικό μήνυμα, τη γραμμή και τον τύπο κάθε τελεστέου. Επανέφερε τον έγκυρο υπολογισμό και μεταγλώττισε ξανά. Μην κρύβεις το πρόβλημα με αυθαίρετη μετατροπή όλων των δεδομένων σε κείμενο.

Κενό δεδομένο ή νόμιμο μηδέν;

Αν αντικαταστήσεις το nil με 0, λαμβάνεις [2, 0, 6] αντί για [2, 6]. Η πολιτική διατήρησης, απόρριψης ή παράλειψης μιας άγνωστης τιμής αλλάζει τη σημασία και το μήκος της συλλογής. Δοκίμασε ξεχωριστά κενή λίστα και λίστα μόνο με nil. Μην θεωρείς ότι η απουσία βαθμολογίας αντιστοιχεί σε πραγματική βαθμολογία μηδέν.

Αυτοτελές εργαστήριο

Σχεδίασε average(scores : Array(Int32?)) και όρισε σαφώς τι επιστρέφει για όλες τις τιμές nil. Έλεγξε θετικούς, αρνητικούς, άγνωστες τιμές και μεγάλο άθροισμα κοντά στα όρια Int32. Δήλωσε τύπο επιστροφής και δικαιολόγησε την αριθμητική αναπαράσταση. Δεν ισχυριζόμαστε μετρήσεις επιδόσεων χωρίς δοκιμή. Πηγή: https://crystal-lang.org/reference/

Crystal — Διαδρομή ουσιαστικής εξάσκησης

Στάδιο 1: κατανόηση εκτέλεσης

Υλοποίησε parser που επιστρέφει Int32? και χειρίσου nil με if αντί not_nil!. Δοκίμασε κενά, μη έγκυρα και out-of-range strings· σύγκρινε compile-time checks με Ruby.

Στάδιο 2: απόδειξη με ελεγχόμενες δοκιμές

Επεξεργάσου Array από named records μέσω each και compact_map. Μέτρησε allocations όπου επιτρέπεται και ξεχώρισε value records από reference objects και mutable state.

Στάδιο 3: μικρό ολοκληρωμένο έργο

Χτίσε CLI ανάγνωσης UTF-8 με error handling. Μην υποθέτεις ότι Ruby gem δουλεύει σε Crystal. Πρόσθεσε specs και δήλωσε έκδοση compiler.