为什么我在使用
&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);
}
}
让我们为生命周期命名(使用想象的语法):
#[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
存在。