我正在开发一个随机文本生成器,它将存储用于输出的"模式"(以及其他参数),我认为&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?

推荐答案

你需要做的就是到处使用'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,
        }
    }
}

Rust相关问答推荐

为什么迭代器上的`. map(...)`的返回类型如此复杂?

是否可以为`T:Copy`执行`T. clone`的测试

在函数内定义impl和在函数外定义impl的区别

在铁 rust 中传递所有权

Rust ECDH 不会产生与 NodeJS/Javascript 和 C 实现相同的共享密钥

仅在使用 &mut 或线程时borrow 的数据在闭包之外转义?

在 Rust 中忽略 None 值的正确样式

在Rust中实现Trie数据 struct 的更好方式

无法将`&Vec>`转换为`&[&str]`

如何从trait方法返回std :: iter :: Map?

有没有办法隐式绑定 let/match 操作的成员?

如何从 x86_64 Mac 构建 M1 Mac?

Rust Serde 为 Option:: 创建反序列化器

在构建器模式中捕获 &str 时如何使用生命周期?

将原始可变指针传递给 C FFI 后出现意外值

在 Rust 中,为什么整数溢出有时会导致编译错误或运行时错误?

仅在运行测试时生成调试输出

从现有系列和 map 值创建新系列

在 Rust 中有条件地导入?

C++ 中的 CRTP 是一种表达其他语言中特征和/或 ADT 的方法吗?