沿多个结构共享 &str 与生命周期冲突

Shared &str along multiple structs conflicts with Lifetimes

我有以下代码:

pub trait Regex: RegexClone {
    fn check(&self) -> Result<u32,(/* errors should detail where it fails*/)>;
    fn next(&self) -> Option<Box<dyn Regex>>;
}

pub trait RegexClone {
    fn regex_clone(&self) -> Box<dyn Regex>;
}
    
pub struct PatternAnyCharacter<'a>{
    string: &'a str
}
    
impl RegexClone for PatternAnyCharacter<'_> {
    fn regex_clone(&self) -> Box<dyn Regex> {
        return Box::new(PatternAnyCharacter {string: self.string})
    }
}

impl Regex for PatternAnyCharacter<'_> {
    fn check(&self) -> Result<u32, ()> {
        if self.string.len() > 0 {
            return Ok(1);
        }
        Err(())
    }

    fn next(&self) ->  Option<Box<dyn Regex>> {
        None
    }
}

我的想法是,当我调用 regex_clone 时,我得到一个新的 Box 与成员具有相同的 &str,我认为这是因为我在调用 regex_clone 时只使用不可变引用会给我一个具有相同字符串切片的新结构,因为引用我没有移动任何东西,但是编译器抱怨如下:

error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` due to conflicting requirements
  --> src/lib.rs:63:25
   |
63 |         return Box::new(PatternAnyCharacter {string: self.string})
   |                         ^^^^^^^^^^^^^^^^^^^
   |
note: first, the lifetime cannot outlive the lifetime `'_` as defined here...
  --> src/lib.rs:61:41
   |
61 | impl RegexClone for PatternAnyCharacter<'_> {
   |                                         ^^
note: ...so that reference does not outlive borrowed content
  --> src/lib.rs:63:54
   |
63 |         return Box::new(PatternAnyCharacter {string: self.string})
   |                                                      ^^^^^^^^^^^
   = note: but, the lifetime must be valid for the static lifetime...
note: ...so that the types are compatible
  --> src/lib.rs:63:16
   |
63 |         return Box::new(PatternAnyCharacter {string: self.string})
   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   = note: expected `Box<(dyn Regex + 'static)>`
              found `Box<dyn Regex>`

我该如何解决这个问题,以便我可以与多个结构共享同一个字符串切片? 我考虑过完全放弃字符串切片作为成员并将其作为参数传递以进行检查,但希望我可以避免它。

如果你想允许它从&self的部分借用,你需要定义返回的dyn Regex不能超过&self的特征:

pub trait RegexClone {
    fn regex_clone<'a>(&'a self) -> Box<dyn Regex + 'a>;
} 

(你也可以使用匿名生命周期(Box<dyn Regex + '_>),但这样更容易理解。)

旁注:我不认为“克隆”是此类函数的正确名称。