2017-10-11 1 views
2

Lire un tutoriel Rust j'ai trouvé l'extrait de code suivant:Les expressions de correspondance de rouille sont-elles de type indéterminé?

let f = File::open("hello.txt"); 

let mut f = match f { 
    Ok(file) => file, 
    Err(e) => return Err(e) 
}; 

Cela semble que f pourrait avoir la valeur du type Result<_, _> (si f == Err(e)) ou une valeur de type _ (c.-à, quel que soit le type file arrive à être).

Cela signifie-t-il que les expressions de correspondance dans Rust sont de type indéterminé?

+4

Je pense que 'return Err (e)' ne définit pas la valeur de 'f', il sort de' match' et renvoie une valeur de la fonction. – Blorgbeard

+0

@LukasKalbertodt: Si 'f' a le type' std :: fs :: File', alors 'f' pourrait avoir le type' std :: fs :: File' donc pas 'Result <_, _>'. Le type indéterminé signifie que 'f' pourrait avoir l'un des deux types inégaux. – George

Répondre

5

Non, les types ne sont pas indéterminés. Vous créez d'abord une liaison de type Result<io::File, io::Error>. Ensuite, vous créez une nouvelle liaison (mutable) pour f de type io::File (parce que c'est ce qui est contenu dans la variante Ok de l'enum Result dans votre cas) Cette nouvelle reliure l'ancienne, tout comme un bloc dans, disons, Perl (et C/C++, etc.) introduirait un nouveau champ d'application:

my $x = [42, 24]; 
{ 
    # new scope 
    my $x = $x->[0]; 
    say Dumper $x; # 42, an INT 
} 
say Dumper $x; # [42, 24], an ARRAY 

à Rust, let peut être considéré comme l'introduction d'un nouveau champ d'application de la même, la liaison précédente observation.

Puisque vous aussi returnde votre fonction lorsque vous rencontrez un Err(_), le compilateur est toujours en mesure de déduire le type de la deuxième liaison de f être io::File.