我目前正在深入研究 rust 并编写一个小数学库。
我想解决的问题非常简单,我想对字段和环进行建模,但是无法正确设置生命周期。

这是代码:

ring.rs:

pub trait Ring {
    fn characteristic() -> int;

    fn is_unit(&self) -> bool;

    fn is_field() -> bool;
}

field.rs:
use ring::Ring;

pub trait Field : Ring {
    fn some_field_method() -> bool {
        true
    }
}

impl Ring for Field {
    fn is_field() -> bool {
        true
    }
}

编译时出现以下错误:
/src/field.rs:9:15: 9:20 error: explicit lifetime bound required
/src/field.rs:9 impl Ring for Field {
                              ^~~~~

我阅读了rust文档,其中包括生命周期部分和rust-by-example部分。一生背后的动机对我来说很明显,我理解所有给出的例子。但是在这里,我完全迷路了。

顺便说一句:这是精简版,我尝试给Field命名生命周期,还包括impl和Ring以及上述的各种组合。

可以让任何人解释这里发生的事情,或者,如果这太具体了,请解释如何使用一生和特质。

谢谢

最佳答案

您正在尝试用特质做一些类似继承的王者模式,但这并不是他们真正的工作方式。

您可以认为特征在某种程度上类似于某些语言提供的接口(interface):它们只是保证您的结构将提供某些方法。

语法trait Foo : Bar并不意味着特质Foo以某种方式是特质Bar的超集,并且为结构体实现Foo也将实现Bar。它仅声明特性Foo仅可用于已实现特性Bar 的结构。您仍然需要自己实现这两个特征。

按照您的示例,您的方法将是这样的:

首先,定义特征Ring:

pub trait Ring {
    fn characteristic(&self) -> int;

    fn is_unit(&self) -> bool;

    fn is_field(&self) -> bool {
        // Default value : not every Ring is a Field
        false
    }
}

然后,特征字段,它需要特征环
pub trait Field : Ring {
    fn some_field_method(&self) -> bool {
        // This is a default value as well
        true
    }
}

然后,您的结构将既是环又是场
struct MyField;

// First, implement Ring for MyField
impl Ring for MyField {
    fn characteristic(&self) -> int {
        2i
    }

    fn is_unit(&self) -> bool {
        false
    }

    fn is_field(&self) -> bool {
        // We override the default value : MyField is a Field
        true
    }
}

// Then we can implement Field for MyField
impl Field for MyField {
    // Nothing here if we keep default implementation of some_field_method
}

现在,对此有生命周期的奇怪错误进行一些解释。

编写impl Ring for Field {...}时,实际上是在尝试为特征对象Ring实现特征Field

特质对象是在使用对结构的引用(如对其特质之一的引用)时所获得的,它们非常独特,并且需要花很多时间才能玩。

但是,在大多数情况下,您不需要使用它们,经典的泛型就足够了。

您可以看看my answer here,在这里我会详细介绍。

关于rust - 特质的一生,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26915970/

10-11 00:54