我正在研究一个随机文本生成器,它将存储输出的“模式”(以及其他参数),我认为
&str
是正确的数据类型,因为我的图书馆的用户将在他的代码。我正在使用“生成器”模式来构建“生成器”结构,并且我想指定该模式将比生成器和生成器都存在。这是我没有生命周期参数的代码:
pub struct Generator {
pub pattern: &str,
}
impl Generator {
pub fn builder() -> GeneratorBuilder {
GeneratorBuilder::new()
}
}
pub struct GeneratorBuilder {
pattern: &str,
}
impl GeneratorBuilder {
pub fn new() -> Self {
Self {
pattern: "",
}
}
pub fn with_pattern(mut self, pattern: &str) -> Self {
self.pattern = pattern;
self
}
pub fn build(&self) -> Generator {
Generator {
pattern: self.pattern,
}
}
}
此时的编译器告诉我,我需要在两个结构定义中使用生命周期说明符,如果我遵循它的建议,我最终会在我的代码的各个地方得到
'a
和 '_
和 'static
。但这不会编译。现在的代码是:
pub struct Generator<'a> {
pub pattern: &'a str,
}
impl Generator<'_> {
pub fn builder() -> GeneratorBuilder<'static> {
GeneratorBuilder::new()
}
}
pub struct GeneratorBuilder<'a> {
pattern: &'a str,
}
impl GeneratorBuilder<'_> {
pub fn new() -> Self {
Self {
pattern: "",
}
}
pub fn with_pattern(mut self, pattern: &str) -> Self {
self.pattern = pattern;
self
}
pub fn build(&self) -> Generator {
Generator {
pattern: self.pattern,
}
}
}
我最终遇到的错误是函数定义中的“lifetime may not live long enough”
with_pattern
因为“assignment requires that [pattern] must outlife [self]”。我的问题是:我在哪里需要生命周期说明符,我需要哪些,以告诉 Rust 称为“模式”的 str 将比 Generator 和 GeneratorBuilder 寿命更长?
你需要做的就是到处使用
'a
:
pub struct Generator<'a> {
pub pattern: &'a str,
}
impl<'a> Generator<'a> {
pub fn builder() -> GeneratorBuilder<'a> {
GeneratorBuilder::new()
}
}
pub struct GeneratorBuilder<'a> {
pattern: &'a str,
}
impl<'a> GeneratorBuilder<'a> {
pub fn new() -> Self {
Self {
pattern: "",
}
}
pub fn with_pattern(mut self, pattern: &'a str) -> Self {
self.pattern = pattern;
self
}
pub fn build(&self) -> Generator {
Generator {
pattern: self.pattern,
}
}
}