gpt4 book ai didi

rust - 为什么生命周期省略对特质不起作用

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

我想创建自己的特征,它应该基于带有i32的索引生成一个f32。我尝试了以下方法,但似乎确实可行:

use std::ops::Index;
// trait by value
pub trait MyTrait:
Index<f32, Output=i32> {
}
虽然按值传递 f32可能是一个好主意,但对于更复杂的类型,我宁愿传递对值的引用,因此我尝试了以下操作:
// trait by reference, not compiling
pub trait MyTrait:
Index<&f32, Output=i32> {
}
包括这个定义给我一个 error[E0106]: missing lifetime specifier。我得到了这个变体工作:
// trait by reference, compiling
pub trait MyTrait<'a>:
Index<&'a f32, Output=i32> {
}
问题是:尽管这种方法有效,但是这意味着实现 MyTrait的任何类型都需要一个显式的生存期参数。
但是,这似乎是不必要的:如果我为自己的结构实现 Index特性,则不需要任何生命周期:
struct Test {
value: i32
}

impl Index<&f32> for Test {
type Output = i32;

fn index(&self, _key: &f32) -> &Self::Output {
&self.value
}
}
问题1:为什么在特征定义中需要额外的生命,为什么不能忽略它?
问题2:是否可以以不必引入生命周期的方式定义特征?

最佳答案

Why do I need the additional lifetime in the definition of the trait, why can't it be elided?



Lifetime elision仅应用于函数签名。所以不,它不适用于您的特征定义。

Can I define the trait in such a way as to avoid having to introduce the lifetime?



当然,您可以像 std::ops::Index 一样使用通用参数:
use std::ops::Index;
pub trait MyTrait<T>: Index<T, Output = i32> {}

struct Test {
value: i32,
}

impl Index<&f32> for Test {
type Output = i32;

fn index(&self, _key: &f32) -> &Self::Output {
&self.value
}
}

impl MyTrait<&f32> for Test {}

关于rust - 为什么生命周期省略对特质不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59803608/

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