gpt4 book ai didi

Rust:对可能拥有的引用中的借用进行生命周期检查

转载 作者:行者123 更新时间:2023-12-05 04:31:08 26 4
gpt4 key购买 nike

我在使用以下代码时遇到问题...

use std::collections::BTreeSet;
use maybe_owned::MaybeOwned;

struct Thing<'a, T> {
set: BTreeSet<MaybeOwned<'a, T>>
}

impl<'a, T: Ord> Thing<'a, T> {
fn take(&mut self, x: T){
let y = self.set.take(&MaybeOwned::Borrowed(&x));
}
}

给出编译器错误

error[E0597]: `x` does not live long enough
--> src/main.rs:10:53
|
8 | impl<'a, T: Ord> Thing<'a, T> {
| -- lifetime `'a` defined here
9 | fn take(&mut self, x: T){
10 | let y = self.set.take(&MaybeOwned::Borrowed(&x));
| ------------------------------------^^--
| | |
| | borrowed value does not live long enough
| argument requires that `x` is borrowed for `'a`
11 | }
| - `x` dropped here while still borrowed

但是此时显然没有借用 x,因为 MaybeOwned 已超出范围,因此封闭的借用已超出范围。

我如何告诉 Rust 编译器这没问题?

最佳答案

问题是,虽然临时MaybeOwned活不了那么久,没关系,因为它隐含了 MaybeOwned<'a, T> .这意味着 x必须至少活到'a但事实并非如此。临时的事实MaybeOwned活不了那么久与借用检查器无关。

BTreeSet::take()的第二个参数是 &Q ,其中集合自己的 T工具 Borrow<Q> . MaybeOwned<'a, T>没有实现 Borrow<MaybeOwned<'b, T>>其中 'b: 'a , 但所有 T&T实现 Borrow<T>多亏了全面的实现,所以给定了一个类型为 &MaybeOwned<'_, T> 的参数,唯一满足 T: Borrow<Q> 的生命周期约束是 &MaybeOwned<'a, T> -- 因此,临时的生命周期参数 MaybeOwned推断为 'a .这是满足特征界限的唯一方法。

幸运的是,这些都不重要,因为 MaybeOwned<'_, T>工具 Borrow<T> ,这意味着您只需提供 &T :

let y = self.set.take(&x);

关于Rust:对可能拥有的引用中的借用进行生命周期检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71890653/

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