2017-07-06 1 views
0

Si la variable d'environnement SOMEVALUE se trouve, il devrait être lié à k:Comment puis-je retourner la valeur correspondante à partir de env :: var?

let k = match env::var(SOMEVALUE) { 
    Ok(val) => {return val}, 
    Err(e) => println!("could not find {}: {}", SOMEVALUE, e), 
}; 

Compiler ce code donne l'erreur suivante

| 
11 |   Ok(val) => {return val}, 
    |       ^^^ expected(), found struct `std::string::String` 
    | 
    = note: expected type `()` 
       found type `std::string::String` 
+5

Vous devriez lire le [livre] (https://doc.rust-lang.org/book/second-edition/) – Stargateur

+0

@Stargateur J'ai lu en fait le livre et en particulier la page sur 'match '. Cependant, cette page ne décrit pas comment extraire la valeur de 'Ok' qui fait partie de la structure' Result'. – duck

+0

@duck vous pouvez toujours consulter les documents std Rust pour trouver des détails applicables à des cas spécifiques (dans ce cas [Document docs] (https://doc.rust-lang.org/std/result/enum.Result.html)) . – ljedrz

Répondre

4

Ce que Victor a écrit est correct, mais vous voulez probablement lier une valeur à k; dans ce cas, vous devez changer votre code:

let k = match env::var(SOMEVALUE) { 
    Ok(val) => val, 
    Err(e) => panic!("could not find {}: {}", SOMEVALUE, e), 
}; 
+0

C'est la réponse que je cherchais, merci. – duck

+1

'Résultat :: unwrap_or_else' – Shepmaster

1

à Rust, tout est une expression, il y a seulement quelques déclarations. Chaque expression renvoie une valeur et si l'expression ne renvoie rien explicitement, elle renvoie implicitement une valeur () (unité).

retourne Votre expression match différents types de 2 branches - une std::String de branche Ok et () de branche Err.

Pour résoudre ce problème, vous devez retourner quelque chose de la deuxième branche aussi:

let k = match env::var(SOMEVALUE) { 
    Ok(val) => {return val}, 
    Err(e) => { 
     println!("could not find {}: {}", SOMEVALUE, e); 

     String::default() 
    }, 
}; 

Ce retourne une valeur du même type - std::String.

+1

Je ne pense pas que l'OP souhaite ce comportement: "Ce que j'essaie d'obtenir avec ce morceau de code, c'est que si la variable d'environnement SOMEVALUE est trouvée, elle est liée à k." – Stargateur

+0

Ne serait-il pas alors préférable de s'éloigner de l'instruction de correspondance dans son ensemble pour éviter d'avoir à faire une comparaison de chaînes pour vérifier s'il y avait une erreur? – duck