Rust 存储可变引用和生存期

Rust 存储可变引用和生存期,rust,lifetime,borrow-checker,Rust,Lifetime,Borrow Checker,我现在已经花了很多时间试图让它工作,但我担心我现在唯一的办法是尝试总结我的代码,并请大家提供帮助 情况是,如果我在下面的代码中取消对mut的两个实例的注释,它将不再编译(并且不是出于对我有意义的原因): 如果有人能解释为什么会这样,我会很高兴;直观地看,RefCell的借用超出范围似乎不应该是一个问题。Vec(因此也包括RefCell)不拥有引用所指向的数据,那么编译器为什么关心引用的生存期呢 另外,我知道我的简化代码摘录并没有说明为什么我要在Vec中存储可变引用,或者为什么我要使用RefCel

我现在已经花了很多时间试图让它工作,但我担心我现在唯一的办法是尝试总结我的代码,并请大家提供帮助

情况是,如果我在下面的代码中取消对
mut
的两个实例的注释,它将不再编译(并且不是出于对我有意义的原因):

如果有人能解释为什么会这样,我会很高兴;直观地看,
RefCell
的借用超出范围似乎不应该是一个问题。
Vec
(因此也包括
RefCell
)不拥有引用所指向的数据,那么编译器为什么关心引用的生存期呢

另外,我知道我的简化代码摘录并没有说明为什么我要在
Vec
中存储可变引用,或者为什么我要使用
RefCell
——不过可以说这并不是偶然的


p.p.S.我尝试过在
索引
方法和/或trait的关联类型上使用一些生存期注释,但到目前为止,这样做只会得到不同的错误

它使用不可变引用的原因是因为它们可以隐式复制。当您切换到尝试返回一个
&mut
时,将有两个地方具有该引用—Vec和函数的调用方。这将引入别名,Rust中不允许使用可变别名

您甚至可以忽略
索引
实现,只需尝试以下操作:

fn main() {
    let mut f = Foo::new(1,2,3);
    f.add_t_ref(1);
    f.add_t_ref(2);
}
您将获得:

error: cannot borrow `f` as mutable more than once at a time
虽然上述所有内容都是正确的,但它并不能真正解释为什么会收到特定的错误消息

fn main() {
    let mut f = Foo::new(1,2,3);
    f.add_t_ref(1);
    f.add_t_ref(2);
}
error: cannot borrow `f` as mutable more than once at a time