特征的生命期

时间:2014-11-13 18:32:40

标签: 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 {
    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 {
                              ^~~~~

我阅读了生锈文档,其中包含了生命周期部分和关于它的示例部分。生命背后的动机对我来说是显而易见的,我理解所有给出的例子。但在这里,我完全迷失了。

顺便说一句:这是缩小版本,我尝试给Field一个命名的生命周期,也就是impl和Ring以及所说的各种组合。

任何人都可以解释这里发生的事情,或者,如果这太具体了,那么如何处理生命和特征。

由于

1 个答案:

答案 0 :(得分:2)

你正试图做一些具有特质的继承之类的模式,这不是它们的工作方式。

你可以认为traits与某些语言提供的接口类似:它们只是你的struct提供一些方法的保证。

语法trait Foo : Bar并不意味着某种特征Foo是特征Bar的超集,并且为结构实现Foo将实现Bar也是。它仅声明特征Foo只能用于已实施特征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
    }
}

然后,特性Field,需要特征Ring

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,我会在其中详细解释。