Pase una variable temporal / local a Err [duplicar]

Nov 16 2020

Tengo esta función que envía una solicitud HTTP analiza la respuesta y devuelve Result:

pub fn get_network_info(&self) -> Result<NetworkInfoResult, &'static str> {
    let rpc = JsonRpc::new(
        String::from("1.0"),
        self.settings.id.clone(),
        String::from("getnetworkinfo"),
        Vec::new(),
    );
    let url = format!("http://{}:{}", self.settings.url, self.settings.port);
    let req = HttpRequest::new_json_rpc(
        url,
        rpc,
        self.settings.user.clone(),
        self.settings.pass.clone(),
    );
    match req.execute() {
        Ok(x) => {
            println!("{}", x.content);
            let parsed: NetworkInfo = serde_json::from_str(&x.content)
                .expect("Failed to parse networkinfo Json response");
            if parsed.id != self.settings.id {
                Err("RPC Request and Response id didn't match!")
            } else {
                if parsed.error.is_some() {
                    Err(&parsed.error.unwrap())
                } else {
                    Ok(parsed.result)
                }
            }
        }
        Err(e) => Err(e),
    }
}

Si el campo de error se establece en la respuesta JSON, queremos devolver un error, en particular el mensaje de error dentro de la respuesta. De lo contrario, devolvemos el campo de resultado de la respuesta analizada.

El problema es que este código Err(&parsed.error.unwrap())no se compila. La razón de esto es que la vida útil de la variable que contiene el parsed.error.unwrap()está solo dentro de la función, por lo tanto, puede que ya no exista en el contexto del llamador.

Mi problema es que Errespera una referencia a una cadena, pero cualquier referencia que intente pasar sería a una variable local o temporal. ¿Cómo soluciono este problema?

Respuestas

Masklinn Nov 16 2020 at 21:03

Mi problema es que Err espera una referencia a una cadena, pero cualquier referencia que intente pasar sería a una variable local o temporal. ¿Alguien puede ayudarme a solucionar este problema?

La "solución alternativa" es arreglar la firma de la función. Devuelva un en toda regla String, o si realmente necesita la eficiencia, devuelva a Cow(para que pueda devolver a Stringo an &'static str). Dado que parsedes un local, no puede devolver una referencia a él.