Rust中调用println!(foo.bar()?)为什么会转移foo的所有权?
问题根因
所有权转移和println!没有任何关系,问题出在方法的签名设计上:
你定义的bar方法签名为pub fn bar(self) -> Result<String>,实际场景中reqwest::blocking::Response的text()方法也是同样的设计——第一个参数是self而非引用,意味着调用该方法时会直接拿走调用者的所有权,方法执行完成后原变量就会失效。
你之前误以为是println!导致所有权转移,只是因为你第一次调用bar()/text()刚好是在println!的参数里而已:就算删掉println!那行,连续两次调用foo.bar()或者res.text(),一样会触发相同的报错。
至于你说“将返回值绑定到其他变量就不报错”,是因为你绑定变量的写法只调用了一次方法,仅转移一次所有权,后续复用的是方法返回的字符串,自然不会触发所有权冲突。
修复方案
提前把方法返回的字符串存到变量里复用即可,不需要重复调用方法:
let res = reqwest::blocking::get(request_path)?; // 仅调用一次text(),保存结果后复用 let resp_text = res.text()?; println!("{}", resp_text); let deserialized = serde_json::from_str(&resp_text)?;
内容的提问来源于stack exchange,提问作者j21
相关产品推荐
相关产品推荐

