我正在开发一个随机文本生成器,它将存储用于输出的"模式"(以及其他参数),我认为&str
是正确的数据类型,因为我的库的用户将在他的代码中指定该模式.我正在使用"生成器"模式来构建"生成器" struct ,并且我希望指定该模式将比构建器和生成器都存活得更长.以下是我的不带生命周期参数的代码:
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,
}
}
}
在这一点上,编译器告诉我在两个 struct 定义中都需要生命周期说明符,如果我遵循它的建议,我在整个代码中的不同位置都会得到'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,
}
}
}
在函数with_pattern
的定义中,我最终得到的错误是"生命周期可能不够长",因为"赋值要求[模式]必须比[自身]长".我的问题是:Where do I need lifetime specifiers, and which ones do I need, to tell Rust that the str called "pattern" will live longer than the Generator and the GeneratorBuilder?