gpt4 book ai didi

rust - 无法在结构内使用多个具有相同生命周期的引用来为生命周期参数推断适当的生命周期[E0495]

转载 作者:行者123 更新时间:2023-12-03 11:47:54 24 4
gpt4 key购买 nike

我的代码中出现了关于终身推断的错误,并且能够将代码简化为以下内容:

use std::collections::HashMap;

struct A<'a> {
x: &'a mut HashMap<&'a str, i32>,
}

impl<'a> A<'a> {
fn new(x: &'a mut HashMap<&'a str, i32>) -> Self {
Self { x }
}

fn test(&mut self) {
let a = A::new(self.x);
}
}

fn main() {
}
由此导致的错误是
error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
--> src/main.rs:13:17
|
13 | let a = A::new(self.x);
| ^^^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 12:5...
--> src/main.rs:12:5
|
12 | / fn test(&mut self) {
13 | | let a = A::new(self.x);
14 | | }
| |_____^
note: ...so that reference does not outlive borrowed content
--> src/main.rs:13:24
|
13 | let a = A::new(self.x);
| ^^^^^^
note: but, the lifetime must be valid for the lifetime `'a` as defined on the impl at 7:6...
--> src/main.rs:7:6
|
7 | impl<'a> A<'a> {
| ^^
note: ...so that the expression is assignable
--> src/main.rs:13:24
|
13 | let a = A::new(self.x);
| ^^^^^^
= note: expected `&mut std::collections::HashMap<&str, i32>`
found `&mut std::collections::HashMap<&'a str, i32>`
我不了解这种情况下的错误是什么,但是我确实发现,如果我将生存期 'b添加到 struct A,以使得 str中的 HashMap引用的生存期为 'b,则代码可以编译。经过上述更改后,代码如下所示:
use std::collections::HashMap;

struct A<'a, 'b> {
x: &'a mut HashMap<&'b str, i32>,
}

impl<'a, 'b> A<'a, 'b> {
fn new(x: &'a mut HashMap<&'b str, i32>) -> Self {
Self { x }
}

fn test(&mut self) {
let a = A::new(self.x);
}
}

fn main() {
}
但是,我不知道为什么这种改变有效。据我了解,两个生存期都为 'a意味着A必须与 HashMap一样长,并且 HashMap必须与用作其键的 &str一样长,我认为这没有问题。我也看不到更改如何为编译器添加任何其他信息。有人可以帮我澄清一下这种情况吗?

最佳答案

A::test()函数更改为

fn test(&'a mut self) { // Add lifetime specification
let a = A::new(self.x);
}
它应该工作。
编译器表示无法推断 A::new()的生存期,并且第一个注释提到“匿名生存期”,这意味着编译器不知道 self.xA::new(self.x)的生存期。因此,我们只需要告诉编译器 self的生命周期为 'a即可。

关于rust - 无法在结构内使用多个具有相同生命周期的引用来为生命周期参数推断适当的生命周期[E0495],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63644297/

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