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

问题描述 投票:0回答:1

我正在研究一个随机文本生成器,它将存储输出的“模式”(以及其他参数),我认为

&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 寿命更长?

rust lifetime builder
1个回答
1
投票

你需要做的就是到处使用

'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,
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.