gpt4 book ai didi

rust - 将生命周期参数限制在函数的参数范围内

转载 作者:行者123 更新时间:2023-11-29 07:54:58 34 4
gpt4 key购买 nike

考虑下面的例子

trait MyTrait<'a> {
type N: 'a;

fn func(&'a self) -> Self::N;
}

fn myfunc<'a, T: 'a + MyTrait<'a>>(g: T) {
g.func();
}

fn main() {}

编译这个小程序失败:

error[E0597]: `g` does not live long enough
--> src/main.rs:8:5
|
8 | g.func();
| ^ borrowed value does not live long enough
9 | }
| - borrowed value only lives until here
|
note: borrowed value must be valid for the lifetime 'a as defined on the function body at 7:1...
--> src/main.rs:7:1
|
7 | fn myfunc<'a, T: 'a + MyTrait<'a>>(g: T) {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

据我了解,生命周期参数 'a 不受限制,可以是任意的。但是g是一个参数,它的生命周期只是函数作用域,所以它不满足func<方法定义中的生命周期'a条件.

我真正想要的是关联类型N 始终限制在MyTraitself 的生命周期内。这就是为什么我想出了 MyTrait 的显式生命周期参数 'a。我希望函数 myfunc 工作,即 'a 应该以某种方式限制在参数 g 的生命周期内。

解决这个问题的“正确”方法是什么?

一个非常简单的例子是

struct MyPtr<'a> {
x: &'a usize,
}

struct MyStruct {
data: Vec<usize>,
}

impl<'a> MyTrait<'a> for MyStruct {
type N = MyPtr<'a>;

fn func(&'a self) -> Self::N {
MyPtr { x: &self.data[0] }
}
}

请注意,这当然是极其简化的。这个想法是 N 总是包含对 MyTrait 中包含的内容的引用,因此永远不会超过 MyTrait

最佳答案

你想要的不是绑定(bind)通用生命周期,而是允许“任何”生命周期:

fn myfunc<T: for<'a> MyTrait<'a>>(g: T) {
g.func();
}

playground 中的完整示例.

最好的解释来源是 How does for<> syntax differ from a regular lifetime bound? .

关于rust - 将生命周期参数限制在函数的参数范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35038461/

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