gpt4 book ai didi

rust - 可变借用似乎超出了它的范围

转载 作者:行者123 更新时间:2023-11-29 08:09:20 25 4
gpt4 key购买 nike

尝试编译这个程序时我卡在了借用检查器上:

use std::collections::BTreeMap;

type Object<'a> = BTreeMap<&'a str, i32>;

struct Root<'a>(Object<'a>);

struct Sub<'a>(&'a mut Object<'a>, &'a str);

impl<'a> Root<'a> {
fn borrow_mut(&'a mut self, data: &'a str) -> Sub<'a> {
Sub(&mut self.0, data)
}

fn borrow(&self) {
println!("{:?}", self.0);
}
}

fn main() {
let mut me = Root(Object::new());
{
me.borrow_mut("data!");
}
me.borrow();
}

( Playground )

我得到:

error[E0502]: cannot borrow `me` as immutable because it is also borrowed as mutable
--> src/main.rs:24:5
|
22 | me.borrow_mut("data!");
| -- mutable borrow occurs here
23 | }
24 | me.borrow();
| ^^ immutable borrow occurs here
25 | }
| - mutable borrow ends here

看起来可变借用应该在 me.borrow() 之前结束,但是借用检查器坚持认为它在 main 结束时结束。

快速解释我要完成的任务:

  1. 创建一个父结构来保存数据
  2. 做一个子类的数据存入父类
  3. 使用此构建器样式模式进行 MongoDB 查询

最佳答案

你正在与一生的问题发生冲突。

你的程序有多个不同的生命周期:

  • type Object<'a> = BTreeMap<&'a str, i32>; => 这是一个
  • &'a mut Object<'a> => 这里最多有两个
  • struct Sub<'a>(&'a mut Object<'a>, &'a str); => 这里最多有三个

显然,没有理由引用 Object<'a>&str 具有相同的生命周期在BTreeMap里面.但是,您告诉编译器您希望两个生命周期相同!

当你写的时候:

struct Sub<'a>(&'a mut Object<'a>, &'a str);

你是在告诉编译器:

  • &str 的生命周期里面BTreeMap
  • Object<'_> 的引用的生命周期
  • &str 的生命周期伴随Object<'_>

都是一样的。

您过度限制了要求;结果,没有解决方案可以满足他们。

多加一个自由度就够了!我们只是将引用的生命周期设为 Object<'_>不同于那些&str的生命周期漂浮:

struct Sub<'a, 'b: 'a>(&'a mut Object<'b>, &'b str);

impl<'b> Root<'b> {
fn borrow_mut<'a>(&'a mut self, data: &'b str) -> Sub<'a, 'b> {
Sub(&mut self.0, data)
}

fn borrow(&self) {
println!("{:?}", self.0);
}
}

注意微妙的'b: 'a :

  • Object<'b>包含对生命周期为 'b 的事物的引用
  • Object<'b> 的引用的生命周期(表示为 'a )必须短于 'b (否则你指的是死的东西?)

因此,我们说 'b超过生命周期'a'b: 'a .

就是这样。只需放宽要求,编译器就可以编译您的代码。


请注意,一般来说,如果您发现自己在写类似 &'a &'a str 的内容你做错了。如果您考虑一下,就会意识到要创建对某物的引用,它必须首先。因此,对对象的引用必然的生命周期比对象本身的生命周期短(非常短)。

关于rust - 可变借用似乎超出了它的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51933984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com