我目前正在考虑生锈并写一个小数学库。 我想解决的问题很简单,我想模拟字段和环,但我不能让生命时间正确。
这里是代码:
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以及所说的各种组合。任何人都可以解释这里发生的事情,或者,如果这太具体了,那么如何处理生命和特征。
由于
答案 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,我会在其中详细解释。