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)
    }
  }
}