Rust 为什么一个非消费构建器编译而另一个不编译?

Rust 为什么一个非消费构建器编译而另一个不编译?,rust,borrow-checker,Rust,Borrow Checker,我阅读并尝试构建两个不同的构建器(Header和Request),如下所示: use std::ascii::AsciiExt; #[derive(PartialEq, Debug)] pub struct Headers<'a> (pub Vec<(&'a str, String)>); impl<'a> Headers<'a> { pub fn replace(&'a mut self, name: &'a

我阅读并尝试构建两个不同的构建器(
Header
Request
),如下所示:

use std::ascii::AsciiExt;

#[derive(PartialEq, Debug)]
pub struct Headers<'a> (pub Vec<(&'a str, String)>);

impl<'a> Headers<'a> {
    pub fn replace(&'a mut self, name: &'a str, value:&str) -> &mut Headers<'a> {
        self.0.retain(|&(key, _)|!name.eq_ignore_ascii_case(key));
        self.0.push((name, value.to_string()));
        self
    }
}

#[derive(PartialEq, Debug)]
pub struct Request<'a> {
    pub headers: Headers<'a>,
}

impl<'a> Request<'a> {
    pub fn header(&'a mut self, name: &'a str, value:&'a str) -> &mut Request<'a> {
        self.headers.replace(name, value);
        self
    }
}

您的生命周期有一个问题:您正在为太多不同的事情使用相同的生命周期(
'a
),因此当编译器尝试为所有这些
'a
使用单一生命周期时,您会收到一条令人困惑的错误消息

解决方法很简单:不要在你一生可以用到的任何地方使用
'a
,而只在必要的地方使用

不需要使用mut self,实例(
self
)不需要与它包含的
&str
具有相同的生存期!(事实上,我真的不能):

impl{

pub fn replace(&mut self,name:&'a str,value:&str)->&mut Headers Request&mut requests事实上,你也可以摆脱第二个生命周期中的'a on value!@DanielWorthington-Bodart:的确,我错过了它。
impl<'a> Headers<'a> {
    pub fn replace(&mut self, name: &'a str, value: &str) -> &mut Headers<'a> {
        self.0.retain(|&(key, _)|!name.eq_ignore_ascii_case(key));
        self.0.push((name, value.to_string()));
        self
    }
}

impl<'a> Request<'a> {
    pub fn header(&mut self, name: &'a str, value: &str) -> &mut Request<'a> {
        self.headers.replace(name, value);
        self
    }
}