我最近开始学习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来移动值,而不是借用它