gpt4 book ai didi

reference - 循环中的可变借用

转载 作者:行者123 更新时间:2023-11-29 07:48:21 25 4
gpt4 key购买 nike

我有以下代码:

struct Baz {
x: usize,
y: usize,
}

struct Bar {
baz: Baz,
}

impl Bar {
fn get_baz_mut(&mut self) -> &mut Baz {
&mut self.baz
}
}

struct Foo {
bar: Bar,
}

impl Foo {
fn foo(&mut self) -> Option<&mut Baz> {
for i in 0..4 {
let baz = self.bar.get_baz_mut();
if baz.x == 0 {
return Some(baz);
}
}
None
}
}

Rust Playground

编译失败:

error[E0499]: cannot borrow `self.bar` as mutable more than once at a time
--> src/main.rs:23:23
|
23 | let baz = self.bar.get_baz_mut();
| ^^^^^^^^ mutable borrow starts here in previous iteration of loop
...
29 | }
| - mutable borrow ends here

但是,如果我返回 Some(baz.x)来自 Foo::foo (并将返回类型更改为 Option<usize> ),代码编译。这让我相信问题不在于循环,即使编译器似乎表明如此。更具体地说,我相信本地可变引用 baz将在循环的下一次迭代中超出范围,导致这不是问题。上面代码的生命周期问题是什么?

以下问题类似:

但是,它们处理显式声明的生命周期(特别是这些显式生命周期是答案的一部分)。我的代码省略了这些生命周期,因此删除它们不是解决方案。

最佳答案

它不起作用,因为返回借用的值会将借用扩展到函数的末尾。

参见 here了解一些有用的细节。

这适用于 non-lexical lifetimes使用 1.27 夜间版:

#![feature(nll)]

struct Baz {
x: usize,
y: usize,
}

// ...

非词汇生命周期 RFC 解释了生命周期的实际工作方式:

Problems arise however when you have a reference that spans multiple statements. In that case, the compiler requires the lifetime to be the innermost expression (which is often a block) that encloses both statements, and that is typically much bigger than is really necessary or desired

rustc 每晚 1.28

作为pointed out by @pnkfelix ,从 nightly 1.28 开始的非词法生命周期实现不再编译上述代码。

但是有 a long-term plan to (re)-enable a more powerful NLL analysis .

关于reference - 循环中的可变借用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50111949/

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