Rust 性状的生命周期

Rust 性状的生命周期,rust,traits,lifetime,Rust,Traits,Lifetime,我现在正潜入锈迹,写一个小数学库。 我想解决的问题很简单,我想对场和环进行建模,但我无法正确计算生命周期 代码如下: 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 { f

我现在正潜入锈迹,写一个小数学库。 我想解决的问题很简单,我想对场和环进行建模,但我无法正确计算生命周期

代码如下:

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 {
                              ^~~~~
我阅读了关于生锈的文档,以及关于它的寿命部分和锈蚀示例部分。生命背后的动机对我来说是显而易见的,我理解所有给出的例子。但在这里,我完全迷路了

顺便说一句:这是一个缩小版,我试着给这个字段一个命名的生存期,还有impl和Ring以及所说的各种组合

请任何人解释一下这里发生了什么,或者,如果这太具体了,请解释一下如何处理生命周期和特征


谢谢

你正在尝试用trait做一些类似于继承王的模式,但实际上它们并不是这样工作的

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

语法
trait Foo:Bar
并不意味着trait
Foo
在某种程度上是trait
Bar
的超集,并且为结构实现
Foo
也将实现
Bar
。它只说明trait
Foo
只能对已经实现trait
Bar
的结构实现。你仍然需要自己实现这两个特性

按照您的示例,您的方法如下:

首先,定义特征环:

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
    }
}
然后是trait字段,它需要trait环

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时,您实际上尝试为trait对象
字段
实现trait

trait对象是当您使用对结构的引用(就像对其某个trait的引用一样)时得到的对象,它们使用起来非常独特,需要一些生命周期

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


你可以看一下,我会详细解释的。

你到底想做什么?为
字段
trait对象实现trait
,而
字段
已经派生自
?@Levans我想在字段中部分实现环。也许另一个例子可以说明这一点:我有一个动物特征,应该有get_leg_编号和get_颜色,然后我想有一个奶牛特征,它实现了动物特征,但默认get_leg_编号为4。我应该补充一点,应该存在一些不像奶牛那样进一步专业化的动物。所以一个戒指需要独立存在。但是每次一个字段都必须是一个响铃谢谢你的快速回答。我也读了你的另一个答案;给了我很多新的见解,但我必须做更多的修改,以充分理解背后的原因。现在我可以继续说:)