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

时间:2016-12-28 09:14:55

标签: rust borrow-checker

我阅读the builder pattern,然后尝试构建2个不同的构建器(HeaderRequest),如下所示:

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
    }
}

为什么Header编译正常,但Request失败并显示:

error[E0499]: cannot borrow `*self` as mutable more than once at a time
   --> src/api.rs:154:9
    |
153 |         self.headers.replace(name, value);
    |         ------------ first mutable borrow occurs here
154 |         self
    |         ^^^^ second mutable borrow occurs here
155 |     }
    |     - first borrow ends here

1 个答案:

答案 0 :(得分:1)

您的生命周期存在问题:您正在重复使用相同的生命周期('a)来处理太多不同的事情,以便当编译器尝试对所有这些{{1}使用单个生命周期时你得到一个令人困惑的错误信息。

解决方案很简单:不要在任何可以放置生命的地方使用'a,但只能在必要的地方使用。{/ p>

没有必要使用'a,实例(&'a mut self)不需要与其包含的self具有相同的生命周期! (实际上,不能真的):

&str