Hello
Je sais pas s'il y a des experts Rust ici mais je tente toujours
J'arrive pas à comprendre comment je fais pour renvoyer une valeur tout en gérant les erreurs en renvoyant un Result. Car le compilateur m'oblige à spécifier le E de Resultat<T,E> alors que pourtant on peut renvoyer Result<()>
J'ai repris le code d'ici: https://rust-lang-nursery.github.io/rust-cookbook/web/clients/download.html
extern crate reqwest;
extern crate tempdir;
use std::io::copy;
use std::fs::File;
use tempdir::TempDir;
fn run() -> Result<()> {
let tmp_dir = TempDir::new("example")?;
let target = "https://www.rust-lang.org/logos/rust-logo-512x512.png";
let mut response = reqwest::get(target)?;
let mut dest = {
let fname = response
.url()
.path_segments()
.and_then(|segments| segments.last())
.and_then(|name| if name.is_empty() { None } else { Some(name) })
.unwrap_or("tmp.bin");
println!("file to download: '{}'", fname);
let fname = tmp_dir.path().join(fname);
println!("will be located under: '{:?}'", fname);
File::create(fname)?
};
copy(&mut response, &mut dest)?;
Ok(())
}
Sauf que moi j'ai besoin de renvoyer un String
donc je voudrais changer le prototype de la fonction en fn run() -> Result<String>
, mais je peux pas, et si je spécifie le type d'erreur, je pourrais plus utiliser les ? pour gérer les exceptions, car je devrais les remplacer par des excepts
Une idée de comment je peux faire ?
(desole, je ne fais pas de rust.)
Essaie Result<String, Box<std::error::Error>>
https://doc.rust-lang.org/rust-by-example/error/multiple_error_types/boxing_errors.html
D'ailleurs, j'ai testé le code donné dans le cookbook, mais renvoyer Result<String> fonctionne chez moi.
Si tu regardes dans le préambule, le type Result<T> est généré par error_chain : https://docs.rs/error-chain/0.12.1/error_chain/index.html#declaring-error-types
Et en faisant un test rapide (en remplaçant le return par Ok(String::from(":noel:")) et le type renvoyé par Result<String>) ça roulait sans soucis
Repost parce que j'avais pas mis mon vpn pour les liens
Le 14 septembre 2019 à 11:04:59 Dark_Chouhartem a écrit :
D'ailleurs, j'ai testé le code donné dans le cookbook, mais renvoyer Result<String> fonctionne chez moi.Si tu regardes dans le préambule, le type Result<T> est généré par error_chain : https://docs.rs/error-chain/0.12.1/error_chain/index.html#declaring-error-types
Et en faisant un test rapide (en remplaçant le return par Ok(String::from(":noel:")) et le type renvoyé par Result<String>) ça roulait sans soucis
Repost parce que j'avais pas mis mon vpn pour les liens
Pour moi ça marche pas
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=53c677844e1e1f4065a348f5a77d947c
error[E0107]: wrong number of type arguments: expected 2, found 1
--> src/main.rs:5:16
|
5 | fn Coucou() -> Result<String>
| ^^^^^^^^^^^^^^ expected 2 type arguments
Le 14 septembre 2019 à 10:17:52 AtmelAVR a écrit :
EssaieResult<String, Box<std::error::Error>>
https://doc.rust-lang.org/rust-by-example/error/multiple_error_types/boxing_errors.html
Merci ça marche Même si j'ai un warning
Par contre je comprends pas la logique d'autoriser la syntaxe Result<()> et pas Result<String>
Le 14 septembre 2019 à 16:03:08 RegleGraduee a écrit :
Merci ça marche Même si j'ai un warning
Il faut ajouter dyn devant Error: Result<String, Box<dyn std::error::Error>>
Par contre je comprends pas la logique d'autoriser la syntaxe Result<()> et pas Result<String>
Comme Dark_Chouhartem, l'a dit c'est la macro error_chain!
qui génère le type Result.
https://docs.rs/error-chain/0.12.1/error_chain/index.html#returning-new-errors
Note that the return type is the typedef Result, which is defined by the macro as pub type Result<T> = ::std::result::Result<T, Error>
Le Result utilsé dans l'exemple du cookbook est un typedef de std::result::Result<T, E> qui ne prend que le type T en paramètre.