首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >性状寿命

性状寿命
EN

Stack Overflow用户
提问于 2014-11-13 18:32:39
回答 1查看 341关注 0票数 0

我现在正在钻研生锈和写一个小小的数学库。我想要解决的问题很简单,我想模拟域和环,但是我不能正确地完成生命周期。

下面是代码:

ring.rs:

代码语言:javascript
复制
pub trait Ring {
    fn characteristic() -> int;

    fn is_unit(&self) -> bool;

    fn is_field() -> bool;
}

field.rs:

代码语言:javascript
复制
use ring::Ring;

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

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

在编译时,我会得到以下错误:

代码语言:javascript
复制
/src/field.rs:9:15: 9:20 error: explicit lifetime bound required
/src/field.rs:9 impl Ring for Field {
                              ^~~~~

我阅读了生锈文档,其中包括寿命部分和生锈示例部分。生活背后的动机对我来说是显而易见的,我理解所有的例子。但在这里,我完全迷路了。

顺便说一句:这是小型化的版本,我试着给场一个命名的生命周期,同时也给了动力和指环,以及各种各样的组合。

请任何人解释这里正在发生的事情,或者,如果这是太具体的话,如何与生命周期和特征一起工作。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 20:01:50

你正试图用特质来做一些类似于继承的模式,这并不是它们真正的工作方式。

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

语法trait Foo : Bar并不意味着特质Foo在某种程度上是特征Bar的超集,而为结构实现Foo也将实现Bar。它只指出,只有已经实现了“特征”( Foo Bar. )的结构,才能实现属性。你还需要自己实现这两种特质。

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

首先,定义特征环:

代码语言:javascript
复制
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
    }
}

然后是特征域,它需要特征环

代码语言:javascript
复制
pub trait Field : Ring {
    fn some_field_method(&self) -> bool {
        // This is a default value as well
        true
    }
}

然后,你的结构,它将是一个环和一个场

代码语言:javascript
复制
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 {...}时,您实际上尝试为属性对象Field实现特征Ring

属性对象是当您使用对结构的引用时所得到的结果,就像引用它的一个特征一样,它们是非常特殊的使用,并且需要使用一些生命周期。

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

您可以看看my answer here,在这里我将对其进行更详细的解释。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26915970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档