为结构实现特征时,为什么会出现“缺少生命周期说明符”或“错误的类型参数数”?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为结构实现特征时,为什么会出现“缺少生命周期说明符”或“错误的类型参数数”?相关的知识,希望对你有一定的参考价值。

我正在尝试为结构定义和实现特征。我在泛型和生命周期中的所有实现都存在问题。这肯定是一个新手的错误。我究竟做错了什么?

卖弄.人生

pub struct Point {
    x: i32,
    y: i32,
}

/// pure lifetime example
pub struct Foo1<'a> {
    pub first_attribute: u32,
    pub second_attribute: Point,
    third_attribute: &'a [Point],
}

pub trait Bar1<'a> {
    fn baaar();
}

impl<'a> Bar1 for Foo1<'a> {
    fn baaar() {}
}

///pure type example
pub struct Foo2<T> {
    pub first_attribute: u32,
    pub second_attribute: Point,
    third_attribute: [T],
}

pub trait Bar2<T> {
    fn baaar(&self);
}

impl<T> Bar2 for Foo2<T> {
    fn baaar(&self) {}
}

/// real world example
pub struct Foo3<'a, T: 'a> {
    pub first_attribute: u32,
    pub second_attribute: Point,
    third_attribute: &'a [T],
}

pub trait Bar3<'a, T: 'a> {
    fn baaar(&self);
}

impl<'a, T: 'a> Bar3 for Foo3<'a, T> {
    fn baaar(&self) {}
}

fn main() {
    let x = Point { x: 1, y: 1 };
    let c = Foo3 {
        first_attribute: 7,
        second_attribute: Point { x: 13, y: 17 },
        third_attribute: &x,
    };

    c.baaar();
}

编译结果

error[E0106]: missing lifetime specifier
  --> src/main.rs:17:10
   |
17 | impl<'a> Bar1 for Foo1<'a> {
   |          ^^^^ expected lifetime parameter

error[E0106]: missing lifetime specifier
  --> src/main.rs:47:17
   |
47 | impl<'a, T: 'a> Bar3 for Foo3<'a, T> {
   |                 ^^^^ expected lifetime parameter

error[E0243]: wrong number of type arguments: expected 1, found 0
  --> src/main.rs:32:9
   |
32 | impl<T> Bar2 for Foo2<T> {
   |         ^^^^ expected 1 type argument

error[E0243]: wrong number of type arguments: expected 1, found 0
  --> src/main.rs:47:17
   |
47 | impl<'a, T: 'a> Bar3 for Foo3<'a, T> {
   |                 ^^^^ expected 1 type argument
答案

错误消息对我来说非常清楚。他们指出类型和状态,类型需要生命周期或类型。添加它们:

impl<'a> Bar1<'a> for Foo1<'a> { /* ... */ }
impl<T> Bar2<T> for Foo2<T> { /* ... */ }
impl<'a, T: 'a> Bar3<'a, T> for Foo3<'a, T> { /* ... */ }

这是必需的,因为您已创建参数化特征:

pub trait Bar3<'a, T: 'a> {
//            ^^^^^^^^^^^
    fn baaar(&self);
}

您定义的特征都不需要任何类型的通用参数,因此“真正的”解决方案就是删除它们。我假设你已经添加了它们用于某些学习目的,但这里没有显示。

以上是关于为结构实现特征时,为什么会出现“缺少生命周期说明符”或“错误的类型参数数”?的主要内容,如果未能解决你的问题,请参考以下文章

4.2 MSP项目群组织的特征

Python实现决策树ID3算法

我可以为单个结构以不同的方式多次实现相同的特征吗?

从源码角度认识 ArrayList ,LinkedList与 HashMap

为啥我的 Diesel 结构中的可选字段没有实现特征

机器学习是什么