gpt4 book ai didi

generics - 为什么我需要为不是结构成员的结构的通用参数提供生命周期?

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

我正在努力了解泛型和生命周期相互作用的方式。考虑:

use std::ops::Add;

struct Gloop<'a, T: Add> {
wumpus: &'a Wumpus<T>,
}

trait Wumpus<T: Add> {
fn fleeb(&self, x: &T) -> bool;
}

struct Mimsy {
jubjub: f64,
}

impl<T: Add> Wumpus<T> for Mimsy {
fn fleeb(&self, x: &T) -> bool {
return (x + x) > 0;
}
}

fn main() {
let a = Mimsy { jubjub: 1. };
let b = Gloop::<i32> { wumpus: &a };
println!("{}", b.fleeb(1));
}

产生:

error[E0309]: the parameter type `T` may not live long enough
--> src/main.rs:4:5
|
3 | struct Gloop<'a, T: Add> {
| -- help: consider adding an explicit lifetime bound `T: 'a`...
4 | wumpus: &'a Wumpus<T>,
| ^^^^^^^^^^^^^^^^^^^^^
|
note: ...so that the reference type `&'a Wumpus<T> + 'a` does not outlive the data it points at
--> src/main.rs:4:5
|
4 | wumpus: &'a Wumpus<T>,
| ^^^^^^^^^^^^^^^^^^^^^

我程序中的哪个对象可能生命周期不够长?两者都没有 GloopMimsy (或任何 Wumpus<T> )是一个 T曾经存储过。

最佳答案

注意:我回答了这个问题,但认为这个问题实际上是重复的

"The parameter type `C` may not live long enough", when it doesn't need to

如果其他人同意,可以删除此答案。


Nowhere in either Gloop or Mimsy (or any Wumpus<T>) is a T ever stored.

Rust 不关心你做什么,而是你能做什么。这两个结构之间没有签名差异:

struct Alpha<T> {
a: T,
}

struct Beta<T> {
b: fn(&T),
}

即,您无法区分两者和 Beta 之间的区别可能变成Alpha对消费者没有明显的外部变化。一旦有了泛型,就需要处理任何可能性。

您可以添加 T: 'static或添加生命周期并添加 T: 'a .

另见:

关于generics - 为什么我需要为不是结构成员的结构的通用参数提供生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49972233/

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