Rust中从Vector返回值触发E0515编译错误的求助
解决Rust中返回引用局部变量的E0515错误
错误原因
你触发的E0515错误,本质是违反了Rust的借用规则:函数返回的&Meta引用指向了函数内部的局部变量chart。当函数执行完毕,chart会被销毁,其内部的result向量也会被释放,此时返回的引用就成了悬空引用——指向已经被回收的内存,Rust的借用检查器会直接阻止这种不安全行为。
解决方案
根据你的需求,有两种常用的修复方式:
1. 克隆Meta对象(推荐,适用于Meta实现Clone trait的情况)
修改函数返回类型为Result<Meta, Error>,通过克隆获取Meta的所有权,避免返回引用:
pub async fn get_history(&self, symbol: &str, range: Interval, interval: Interval) -> Result<Meta, Error> { let mut url = self.url .join(format!("/v8/finance/chart/{}", symbol).as_str()) .unwrap(); url.query_pairs_mut() .append_pair("interval", &interval.to_string()) .append_pair("range", &range.to_string()) .append_pair("events", "div,splits"); let chart = self.perform_request::<Chart>(url).await?; if chart.chart.result.is_empty() { return Err(Error::ErrNoResultsFound); } let meta = chart.chart.result .get(0) .ok_or(Error::ErrNoResultsFound)? .clone(); // 克隆获取所有权 Ok(meta) }
2. 从向量中取出元素所有权(适用于不需要保留原向量的情况)
如果不需要保留chart.chart.result中的其他元素,可以用remove(0)直接取出第一个元素的所有权,这样也能避免返回引用:
pub async fn get_history(&self, symbol: &str, range: Interval, interval: Interval) -> Result<Meta, Error> { let mut url = self.url .join(format!("/v8/finance/chart/{}", symbol).as_str()) .unwrap(); url.query_pairs_mut() .append_pair("interval", &interval.to_string()) .append_pair("range", &range.to_string()) .append_pair("events", "div,splits"); let mut chart = self.perform_request::<Chart>(url).await?; if chart.chart.result.is_empty() { return Err(Error::ErrNoResultsFound); } let meta = chart.chart.result .remove(0) // 取出第一个元素的所有权,原向量会移除该元素 .ok_or(Error::ErrNoResultsFound)?; Ok(meta) }
关键提醒
Rust的核心设计之一就是通过所有权和借用规则避免悬空引用,所以永远不要尝试返回指向局部变量的引用。如果确实需要共享数据,应该考虑使用智能指针(如Arc),但对于这个场景,返回所有权对象是最直接的解决方案。
内容的提问来源于stack exchange,提问作者Felipe Umpierre
相关产品推荐
相关产品推荐

