임시 / 로컬 변수를 Err [중복]에 전달

Nov 16 2020

HTTP 요청을 보내는이 함수가 응답을 구문 분석하고 다음을 반환합니다 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),
    }
}

JSON 응답에 오류 필드가 설정되어 있으면 오류, 특히 응답 내의 오류 메시지를 반환하려고합니다. 그렇지 않으면 파싱 된 응답의 결과 필드를 반환합니다.

이 코드가 Err(&parsed.error.unwrap())컴파일하지 않는 문제입니다 . 그 이유는를 포함하는 변수의 수명이 parsed.error.unwrap()함수 내에 만 있으므로 호출자의 컨텍스트에서 더 이상 존재하지 않을 수 있기 때문입니다.

내 문제는 Err문자열에 대한 참조를 기대하지만 전달하려는 참조는 로컬 또는 임시 변수에 대한 것입니다. 이 문제를 어떻게 해결합니까?

답변

Masklinn Nov 16 2020 at 21:03

내 문제는 Err이 문자열에 대한 참조를 기대하지만 전달하려는 참조는 로컬 또는 임시 변수에 대한 것입니다. 아무도이 문제를 해결하도록 도와 줄 수 있습니까?

"해결 방법"은 함수의 서명을 수정하는 것입니다. 본격적인을 반환 String하거나 효율성이 정말로 필요한 경우 a를 반환합니다 Cow(따라서 a String또는 an을 반환 할 수 있습니다 &'static str). parsed는 로컬 이므로 참조를 반환 할 수 없습니다.