从Vector返回值引发E0515

  • 本文关键字:E0515 返回值 Vector rust
  • 更新时间 :
  • 英文 :


我最近开始学习Rust,在理解为什么会出现这个特殊错误时遇到了一些困难。我在谷歌上搜索了一下,试图找到一个和我类似的问题,但没有任何运气。

我正在尝试对雅虎金融API进行HTTP调用,并从其中一个端点提取元响应。

这是我的功能:

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)?;
Ok(meta)
}

我得到的错误如下:

error[E0515]: cannot return value referencing local data `chart.chart.result`
--> src/finance/yahoo.rs:114:9
|
111 |         let meta = chart.chart.result.get(0)
|                    ------------------------- `chart.chart.result` is borrowed here
...
114 |         Ok(meta)
|         ^^^^^^^^ returns a value referencing data owned by the current function

我已经有了其他函数,但它们都没有从Vector中提取一个元素。

感谢您的支持。

您在函数内部定义了图表,因此它是在堆栈上分配的。然后,您返回了对chart.chart.result的引用,该引用引用了函数堆栈上的值。问题是,一旦函数结束,堆栈就会被释放,从而导致返回的值无效(指针无效(。

所以Rust是在保护你,只要堆栈有效,你就可以在函数内部借用引用,但你不能在函数之外返回它

对此的解决方案是使用Box for chart,它将在堆上分配它。但在这种情况下,你需要使用take而不是get来移动值,而不是借用它