Warum geht der Compiler davon aus, dass der Wert von if let `()` sein soll?

Ich habe den folgenden Code:

use std::collections::HashSet;

fn translate() -> Option<String> {
    None
}

fn main() {
    let mut found = HashSet::new();

    if let Some(tr) = translate() {
        found.insert(tr);
    }
}

Es funktioniert einwandfrei, aber wenn ich das Semikolon nach @ entferfound.insert(tr), Ich erhalte einen Compiler-Fehler:

error[E0308]: mismatched types
  --> src/main.rs:11:9
   |
7  | fn main() {
   |           - expected `()` because of default return type
...
11 |         found.insert(tr)
   |         ^^^^^^^^^^^^^^^^- help: try adding a semicolon: `;`
   |         |
   |         expected (), found bool
   |
   = note: expected type `()`
              found type `bool`

Es ist egal, wo sich dieser Code befindet oder ob es sich um den letzten Ausdruck der Funktion handelt.

Warum geht der Compiler davon aus, dass der Ausdruck in den geschweiften Klammern @ sein soll()?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage