DedSec Project

E0308 — DedSec Project

Rust E0308 — ασύμβατος τύπος έκφρασης Βρες το λάθος branch Στη Rust τα branches που δίνουν τιμή πρέπει να έχουν συμβατούς τύπους. Ένα τυχαίο semicolon μετατρέπει expression σε unit ()…

Rust E0308 — ασύμβατος τύπος έκφρασης

Βρες το λάθος branch

Στη Rust τα branches που δίνουν τιμή πρέπει να έχουν συμβατούς τύπους. Ένα τυχαίο semicolon μετατρέπει expression σε unit (), προκαλώντας mismatch με τον τύπο επιστροφής.

fn classify(score: u8) -> &'static str {
    if score >= 50 { "pass" } else { "retry" }
}
fn main() {
    assert_eq!(classify(49), "retry");
    assert_eq!(classify(50), "pass");
}

Παράδειγμα που πρέπει να αποτύχει:

// fn broken() -> i32 {
//     let value = 3;
//     value; // με semicolon παράγει (), όχι i32
// }

Έλεγξε τη σύμβαση τύπων

Διάβασε και τα δύο branches του if, κάθε match arm, τον return type και την τελευταία έκφραση κάθε block. Αποφάσισε αν επιστρέφεις borrowed &str ή owned String και στις δύο περιπτώσεις. Μην προσθέτεις cast μόνο για να εξαφανιστεί το error.

Άσκηση

Άλλαξε την classify ώστε να επιστρέφει enum Pass/Retry με PartialEq και έλεγξε τιμές 0, 49, 50, 100, 255. Η σωστή μεταγλώττιση και το σωστό business threshold είναι διαφορετικές απαιτήσεις.

Επίσημη διάγνωση: https://doc.rust-lang.org/error_codes/E0308.html

Πραγματική διόρθωση με ίδιο τύπο και στα δύο branches

Αν η μία διακλάδωση επιστρέφει επιτυχία και η άλλη σφάλμα, μην προσπαθείς να τα εξαναγκάσεις με cast. Χρησιμοποίησε ενιαίο Result:

fn parse_port(text: &str) -> Result<u16, &'static str> {
    match text.parse::<u16>() {
        Ok(value) if value > 0 => Ok(value),
        Ok(_) => Err("port must be nonzero"),
        Err(_) => Err("invalid decimal port"),
    }
}

Τα tests είναι "8080" (επιτυχία), "0" (λογικό σφάλμα domain) και "70000" (δεν χωράει σε u16). Αν επιστρέψεις Ok(8080) από το πρώτο branch αλλά απλό "invalid" από το δεύτερο, οι τύποι δεν συμφωνούν. Χρειάζεται Err("invalid"), όχι μετατροπή του αριθμού χωρίς έλεγχο. Αν γράψεις Ok(value); ως τελευταία γραμμή, το semicolon αφήνει ως τελική τιμή το ().