Στη Rust, η ανάθεση μιας τιμής σε ένα όνομα ονομάζεται πρόσδεση. Οι προσδέσεις είναι αμετάβλητες, εκτός αν δηλωθούν με τη λέξη-κλειδί mut. Καθώς η Rust είναι μια στατικά τυποποιημένη γλώσσα, κάθε πρόσδεση έχει έναν τύπο που είναι γνωστός κατά τη μεταγλώττιση.
Οι προσδέσεις ορίζονται συνήθως με τη λέξη-κλειδί let. Ο καθορισμός του τύπου μιας πρόσδεσης είναι προαιρετικός για τις περισσότερες προσδέσεις, καθώς ο συμπερασμός τύπου της Rust μπορεί συνήθως να συμπεράνει τον τύπο με βάση την τιμή τους. Μια πρόσδεση μοιάζει κάπως έτσι:
// Automatically inferred type
let fingers = 10;
Οι συναρτήσεις είναι στοιχεία. Ενώ οι προσδέσεις αναφέρονται συνήθως σε μια συγκεκριμένη τιμή, τα στοιχεία αναφέρονται σε μια μονάδα οργάνωσης κώδικα, συνήθως μια συνάρτηση ή ένα άρθρωμα, που είναι διαθέσιμη σε όλη τη διάρκεια ζωής του προγράμματος. Μια συνάρτηση επιστρέφει αυτόματα το αποτέλεσμα της τελευταίας της έκφρασης. Μια συνάρτηση μπορεί να έχει 0 ή περισσότερες παραμέτρους, οι οποίες είναι προσδέσεις που ζουν όσο διαρκεί η κλήση της συνάρτησης.
Ο συμπερασμός τύπου είναι θεωρητικά εφικτός και για τις συναρτήσεις, αλλά έχει απενεργοποιηθεί ως σκόπιμη επιλογή σχεδιασμού της γλώσσας. Αν και αυτό σημαίνει ότι χρειάζεται να αφιερώσεις λίγο περισσότερο χρόνο γράφοντας κώδικα για να προσδιορίσεις με ακρίβεια ποιοι είναι οι τύποι εισόδου και εξόδου μιας συνάρτησης, κερδίζεις αυτόν τον χρόνο όταν διαβάζεις τον κώδικα, επειδή όλοι οι τύποι εισόδου και εξόδου είναι ρητά καθορισμένοι.
fn add(x: i32, y: i32) -> i32 {
x + y
}
Για να καλέσεις μια συνάρτηση, γράφεις το όνομά της ακολουθούμενο από παρενθέσεις. Αν η συνάρτηση απαιτεί παραμέτρους, πρέπει να δώσεις ένα όρισμα για καθεμία μέσα στις παρενθέσεις.
let five = add(2, 3);
Αν ο τύπος μιας πρόσδεσης δεν μπορεί να συμπεραθεί, ο μεταγλωττιστής θα αναφέρει ένα σφάλμα. Για να το διορθώσεις, πρόσθεσε μια ρητή σημείωση τύπου στην πρόσδεση.
// Explicit type annotation
let fingers: i32 = 10;
Τα στοιχεία στη Rust μπορούν να χρησιμοποιηθούν πριν ή αφού οριστούν, επειδή έχουν στατική διάρκεια ζωής. Οι προσδέσεις, από την άλλη, μπορούν να χρησιμοποιηθούν μόνο αφού οριστούν. Η χρήση μιας πρόσδεσης πριν οριστεί οδηγεί σε σφάλμα μεταγλώττισης.
fn main() {
// `fn add` hasn't yet been defined, but that's perfectly ok
dbg!(add(3, 4));
}
fn add(x: i32, y: i32) -> i32 {
x + y
}
// this won't compile; `a` is used before its binding is defined
let b = a;
let a = x + y;
Η Rust χρησιμοποιεί άγκιστρα ({}) για να ορίσει μια εμβέλεια. Μια πρόσδεση που ορίζεται μέσα σε μια εμβέλεια δεν μπορεί να ξεφύγει από αυτήν.
let a = 1;
dbg!(a); // 1
{
// Here, we re-bind `a` to a new value, which is still immutable.
// This technique is called _shadowing_. The new binding is constrained to
// this anonymous scope. Outside this scope, the previous binding still
// applies.
let a = 2;
let b = 3;
dbg!(a, b); // 2, 3
}
// can't use `b` anymore because it is out of scope
// dbg!(b);
// The shadowed `a` in the inner scope above has fallen out of scope,
// leaving us with our original binding.
dbg!(a); // 1
Τα στοιχεία της Rust οργανώνονται συχνά σε αρθρώματα. Κάθε crate είναι σιωπηρά ένα άρθρωμα, αλλά μπορεί να ορίσει εσωτερικά υπο-αρθρώματα οποιουδήποτε βάθους. Ένα άρθρωμα ομαδοποιεί σχετική λειτουργικότητα και ορίζεται με τη λέξη-κλειδί mod.
mod calc_i32 {
fn add(a: i32, b: i32) -> i32 { a + b }
fn sub(a: i32, b: i32) -> i32 { a - b }
fn mul(a: i32, b: i32) -> i32 { a * b }
fn div(a: i32, b: i32) -> i32 { a / b }
}
Η Rust υποστηρίζει δύο τύπους σχολίων. Τα // δηλώνουν ένα σχόλιο μίας γραμμής· ό,τι ακολουθεί μετά τα // μέχρι το τέλος της γραμμής αγνοείται. Τα /* και */ δηλώνουν ένα σχόλιο πολλών γραμμών· ό,τι βρίσκεται ανάμεσά τους αγνοείται. Είναι ιδιωματικό και καλή πρακτική να προτιμάς τα σχόλια μίας γραμμής.
Η Rust υποστηρίζει επίσης σχόλια τεκμηρίωσης, τα οποία εμφανίζονται στην παραγόμενη τεκμηρίωση που δημιουργεί το cargo doc. Τα εξωτερικά σχόλια τεκμηρίωσης σχηματίζονται με το ///, το οποίο λειτουργεί ακριβώς όπως το //. Εφαρμόζονται στο στοιχείο που τα ακολουθεί, όπως μια συνάρτηση:
/// The `add` function produces the sum of its arguments.
fn add(x: i32, y: i32) -> i32 { x + y }
Τα εσωτερικά σχόλια τεκμηρίωσης σχηματίζονται με το //!, το οποίο λειτουργεί ακριβώς όπως το //. Εφαρμόζονται στο στοιχείο που τα περιβάλλει, όπως ένα άρθρωμα:
mod my_cool_module {
//! This module is the bee's knees.
}
Τα σχόλια τεκμηρίωσης μπορούν να έχουν οποιοδήποτε μήκος και να περιέχουν markdown, το οποίο αποδίδεται στην παραγόμενη τεκμηρίωση.
Σε αυτή την άσκηση θα γράψεις κώδικα για να σε βοηθήσει να μαγειρέψεις μια υπέροχη λαζάνια από το αγαπημένο σου βιβλίο μαγειρικής.
Έχεις τέσσερις εργασίες, όλες σχετικές με τον χρόνο που ξοδεύεις για να μαγειρέψεις τη λαζάνια.
Όρισε τη συνάρτηση expected_minutes_in_oven για να ελέγξεις πόσα λεπτά πρέπει να είναι η λαζάνια στο φούρνο. Σύμφωνα με το βιβλίο μαγειρικής, ο αναμενόμενος χρόνος στο φούρνο σε λεπτά είναι 40:
expected_minutes_in_oven()
// Returns: 40
Όρισε τη συνάρτηση remaining_minutes_in_oven που παίρνει ως παράμετρο τα πραγματικά λεπτά που η λαζάνια βρίσκεται στο φούρνο και επιστρέφει πόσα λεπτά πρέπει ακόμα να μείνει η λαζάνια στο φούρνο, με βάση τον αναμενόμενο χρόνο στο φούρνο σε λεπτά από την προηγούμενη εργασία.
remaining_minutes_in_oven(30)
// Returns: 10
Όρισε τη συνάρτηση preparation_time_in_minutes που παίρνει ως παράμετρο τον αριθμό των στρώσεων που πρόσθεσες στη λαζάνια και επιστρέφει πόσα λεπτά ξόδεψες για να προετοιμάσεις τη λαζάνια, υποθέτοντας ότι κάθε στρώση σου παίρνει 2 λεπτά για προετοιμασία.
preparation_time_in_minutes(2)
// Returns: 4
Όρισε τη συνάρτηση elapsed_time_in_minutes που παίρνει δύο παραμέτρους: η πρώτη παράμετρος είναι ο αριθμός των στρώσεων που πρόσθεσες στη λαζάνια, και η δεύτερη παράμετρος είναι ο αριθμός των λεπτών που η λαζάνια βρίσκεται στο φούρνο. Η συνάρτηση θα πρέπει να επιστρέφει πόσα λεπτά έχεις δουλέψει για το μαγείρεμα της λαζάνια, που είναι το άθροισμα του χρόνου προετοιμασίας σε λεπτά και του χρόνου σε λεπτά που η λαζάνια έχει περάσει στο φούρνο τη δεδομένη στιγμή.
elapsed_time_in_minutes(3, 20)
// Returns: 26
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Rust με 99 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.