Rust 为锈菌的性状提供类似遗传的行为
假设我有两个小特性,解析器和触发器。 解析器获取一个字符串片段,进行一些解析,并返回没有使用标记的字符串片段。出错时,它返回一个错误。 触发器与解析器类似,只是它不需要任何标记,因此它会执行某些操作,并可能返回错误。每个触发器都可以被视为解析器,我想定义使该规则成为现实的函数。这是我的直觉让我做的:Rust 为锈菌的性状提供类似遗传的行为,rust,traits,Rust,Traits,假设我有两个小特性,解析器和触发器。 解析器获取一个字符串片段,进行一些解析,并返回没有使用标记的字符串片段。出错时,它返回一个错误。 触发器与解析器类似,只是它不需要任何标记,因此它会执行某些操作,并可能返回错误。每个触发器都可以被视为解析器,我想定义使该规则成为现实的函数。这是我的直觉让我做的: pub trait Parser<'a> { fn parse(&mut self, &'a [String]) -> Result<&'a [S
pub trait Parser<'a> {
fn parse(&mut self, &'a [String]) -> Result<&'a [String], Error>;
}
pub trait Trigger {
fn pull(&mut self) -> Option<Error>;
}
impl<'a> Parser<'a> for Trigger {
fn parse(&mut self, tokens: &'a [String]) -> Result<&'a [String], Error> {
match self.pull() {
Some(err) => Err(err),
_ => Ok(tokens) //Returns the tokens untouched
}
}
}
Rust中的pub trait Parser Result Parsertrait不是常规类型。它们既可以用作泛型边界,也可以用作特征对象,这是常规类型,但也需要某种间接方式来使用它们(引用或
框
)。另一方面,您正试图为裸触发器实现解析器。裸特征是动态大小的类型,一般来说,它们不能在普通大小的类型可以使用的任何地方使用
您真正想要的是为实现触发器
的每种类型实现解析器
。这可以用非常简单的方式编写:
impl<'a, T> Parser<'a> for T where T: Trigger {
fn parse(&mut self, tokens: &'a [String]) -> Result<&'a [String], Error> {
match self.pull() {
Some(err) => Err(err),
_ => Ok(tokens)
}
}
}
impl for T,其中T:Trigger{
FN解析(和Mutt,toks:&‘Actring’)->结果是正确的,谢谢,这正是我正在寻找的。我将考虑移动生命周期参数,看看会发生什么:)。
impl<'a, T> Parser<'a> for T where T: Trigger {
fn parse(&mut self, tokens: &'a [String]) -> Result<&'a [String], Error> {
match self.pull() {
Some(err) => Err(err),
_ => Ok(tokens)
}
}
}