Rust 重构会把可变借阅搞得一团糟——为什么?

Rust 重构会把可变借阅搞得一团糟——为什么?,rust,lifetime,Rust,Lifetime,我试图理解为什么以下重构会导致错误,即使它实际上应该具有相同的行为: 之前: fn请求处理程序(请求:&mut请求)->IronResult{ 让pool=req.get::().ok().expect(“数据库组件未初始化”); 让连接=pool.get().unwrap(); 让我们使用seu id=req.extensions.get::().unwrap().find(“id”); ... 之后: pub fn get_pool_connection PooledConnection这

我试图理解为什么以下重构会导致错误,即使它实际上应该具有相同的行为:

之前:

fn请求处理程序(请求:&mut请求)->IronResult{
让pool=req.get::().ok().expect(“数据库组件未初始化”);
让连接=pool.get().unwrap();
让我们使用seu id=req.extensions.get::().unwrap().find(“id”);
...
之后:


pub fn get_pool_connection PooledConnection这实际上正是生命周期注释的含义。如果您有一个具有此原型的函数:

fn get_bar<'a>(&'a Foo) -> Bar<'a> { ... }
fn获取条形图
,其中
'a
和'a mut req
中定义的生存期,因此它被视为
req
的可变借用

它在重构之前起作用,因为
连接
的生存期实际上链接到
的生存期,而池没有借用
req
,因为它不包含任何生存期参数


由于重构迫使
连接
借用
req
,这在以前是不需要的,可能这不是一个合适的重构。

错误表明,
*req
被借用正是因为
req
是一个引用。毕竟,您通常借用引用点处的一些自有数据,而不是它的引用点有什么方法可以返回连接并使重构工作正常吗?或者在这种情况下我也必须返回池吗?你将很难同时返回池和连接,因为它们的生命周期是捆绑在一起的。在这种只将两行代码重构成一个函数的情况下,我看不到比不是重构。
fn get_bar<'a>(&'a Foo) -> Bar<'a> { ... }