借用检查器和 &mut 借用通用参数

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

为什么我在使用

&mut x
时不能多次借用
is_mut_t
。但用
is_mut_specific
就可以了?

#[cfg(test)]
mod test {
    use std::marker::PhantomData;

    #[test]
    fn test_wc() {
        struct Test<T>{ phantom_data: PhantomData<T>}
        impl <T> Test<T> {
            fn new() -> Self {
                Test { phantom_data: PhantomData }
            }
            fn is_mut_t(&mut self, i: T) {}
            fn is_mut_specific(&mut self, i: &mut i32) {}
        }

        let mut x = 5;
        let mut t: Test<&mut i32> = Test::new();
        
        t.is_mut_specific(&mut x);
        t.is_mut_specific(&mut x);
        // t.is_mut_t(&mut x);
        // t.is_mut_t(&mut x);
    }
}
rust borrow-checker
1个回答
0
投票

让我们为生命周期命名(使用想象的语法):

#[cfg(test)]
mod test {
    use std::marker::PhantomData;

    #[test]
    fn test_wc() {
        struct Test<T> { phantom_data: PhantomData<T> }
        impl<T> Test<T> {
            fn new() -> Self {
                Test { phantom_data: PhantomData }
            }
            fn is_mut_t<'a>(&'a mut self, i: T) {}
            fn is_mut_specific<'b, 'c>(&'b mut self, i: &'c mut i32) {}
        }

        let mut x = 5;
        let mut t: Test<&'d mut i32> = Test::new();
        
        (&'e mut t).is_mut_specific::<'e, 'f>(&'f mut x);
        (&'g mut t).is_mut_specific::<'g, 'h>(&'h mut x);
        // (&'i mut t).is_mut_t::<'i>(&'j mut x);
        // (&'k mut t).is_mut_t::<'k>(&'l mut x);
    }
}

每次出现

T
时都会替换为
&'d mut i32
。你能找出问题所在吗?

当我们在签名中说

&mut i32
时,就会被分配一个可以是任意的通用生命周期。

但是当我们说

T
时,必须T
完全
相同。这包括相同的生命周期。但如果我们借用
x
来换取
'd
,我们就不能在
'd
中再次借用它,这意味着至少只要
t
存在。

© www.soinside.com 2019 - 2024. All rights reserved.