我目前正在深入研究 rust 并编写一个小数学库。
我想解决的问题非常简单,我想对字段和环进行建模,但是无法正确设置生命周期。
这是代码:
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 {
^~~~~
我阅读了rust文档,其中包括生命周期部分和rust-by-example部分。一生背后的动机对我来说很明显,我理解所有给出的例子。但是在这里,我完全迷路了。
顺便说一句:这是精简版,我尝试给Field命名生命周期,还包括impl和Ring以及上述的各种组合。
可以让任何人解释这里发生的事情,或者,如果这太具体了,请解释如何使用一生和特质。
谢谢
最佳答案
您正在尝试用特质做一些类似继承的王者模式,但这并不是他们真正的工作方式。
您可以认为特征在某种程度上类似于某些语言提供的接口(interface):它们只是保证您的结构将提供某些方法。
语法trait Foo : Bar
并不意味着特质Foo
以某种方式是特质Bar
的超集,并且为结构体实现Foo
也将实现Bar
。它仅声明特性Foo
仅可用于已实现特性Bar
的结构。您仍然需要自己实现这两个特征。
按照您的示例,您的方法将是这样的:
首先,定义特征Ring:
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 {...}
时,实际上是在尝试为特征对象Ring
实现特征Field
。特质对象是在使用对结构的引用(如对其特质之一的引用)时所获得的,它们非常独特,并且需要花很多时间才能玩。
但是,在大多数情况下,您不需要使用它们,经典的泛型就足够了。
您可以看看my answer here,在这里我会详细介绍。
关于rust - 特质的一生,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26915970/