【问题标题】:Why my rust function get an " returns a value referencing data owned by the current function" error?为什么我的 rust 函数会出现“返回引用当前函数拥有的数据的值”错误?
【发布时间】:2021-06-11 07:21:44
【问题描述】:

我知道我不能从函数返回借来的值,但我不知道如何解决它。这是我的功能:

pub fn query(&self, sql: &str, params: &[&dyn ToSql]) -> Result<ResultSet<Row>, Error> {
    let pool = self.pool.clone();
    let con = pool.get().unwrap();
    let rows = con.query(sql, params).unwrap();
    Ok(rows)
}

这是错误:

error[E0515]: cannot return value referencing local variable `con`
  --> BloodTranslate\src\my_db\oracle_mod.rs:62:9
   |
61 |         let rows = con.query(sql,params).unwrap();
   |                    --- `con` is borrowed here
62 |         Ok(rows)
   |         ^^^^^^^^ returns a value referencing data owned by the current function

非常感谢!!!

【问题讨论】:

  • r2d2_oracle 和 oracle crate。
  • 我试试用let con = self.pool.get().unwrap();,还是一样。

标签: rust


【解决方案1】:

ResultSet 具有完整类型ResultSet&lt;'a, Row&gt;,因此由于绑定到生命周期'a,您根本无法返回它。但是您可以将其转换为您喜欢的拥有类型,例如一个向量:

pub fn query(&self, sql: &str, params: &[&dyn ToSql]) -> Result<Vec<Row>, Error> {
    let pool = self.pool.clone();
    let con = pool.get().unwrap();
    let rows = con.query(sql, params).unwrap();
    rows.into_iter().collect()
}

请注意,如果您只需要一行,则涉及额外的分配,并且可能是多余的。

【讨论】:

  • 谢谢,我是生锈的新手。我试着回答你,但它不起作用。这是错误value of type `Vec&lt;r2d2_oracle::oracle::Row&gt;` cannot be built from `std::iter::Iterator&lt;Item=std::result::Result&lt;r2d2_oracle::oracle::Row, r2d2_oracle::oracle::Error&gt;&gt;
  • 哦,我的错,没有注意到 ResultSet::into_iter 实际上迭代了 Result-s,而不是 Row-。给我一点时间,我会修改答案。
  • 非常感谢您的支持。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-12
  • 2022-08-15
  • 1970-01-01
  • 2021-09-28
  • 2021-01-18
相关资源
最近更新 更多