我现在正在钻研生锈和写一个小小的数学库。我想要解决的问题很简单,我想模拟域和环,但是我不能正确地完成生命周期。
下面是代码:
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 {
^~~~~我阅读了生锈文档,其中包括寿命部分和生锈示例部分。生活背后的动机对我来说是显而易见的,我理解所有的例子。但在这里,我完全迷路了。
顺便说一句:这是小型化的版本,我试着给场一个命名的生命周期,同时也给了动力和指环,以及各种各样的组合。
请任何人解释这里正在发生的事情,或者,如果这是太具体的话,如何与生命周期和特征一起工作。
谢谢
发布于 2014-11-13 20:01:50
你正试图用特质来做一些类似于继承的模式,这并不是它们真正的工作方式。
您可以认为特性在某种程度上类似于某些语言提供的接口:它们只是您的结构将提供某些方法的保证。
语法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
}
}然后是特征域,它需要特征环
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 {...}时,您实际上尝试为属性对象Field实现特征Ring。
属性对象是当您使用对结构的引用时所得到的结果,就像引用它的一个特征一样,它们是非常特殊的使用,并且需要使用一些生命周期。
但是,在大多数情况下,您不需要使用它们,而经典的泛型就足够了。
您可以看看my answer here,在这里我将对其进行更详细的解释。
https://stackoverflow.com/questions/26915970
复制相似问题