《Rustonomicon》 的最新版本包含以下示例代码:
use std::mem;
pub struct IterMut<'a, T: 'a>(&'a mut [T]);
impl<'a, T> Iterator for IterMut<'a, T> {
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
let slice = mem::replace(&mut self.0, &mut []);
if slice.is_empty() {
return None;
}
let (l, r) = slice.split_at_mut(1);
self.0 = r;
l.get_mut(0)
}
}
我对这行特别困惑:
let slice = mem::replace(&mut self.0, &mut []);
// ^^^^^^^
这个借用怎么检查?如果这是一个不可变借用,RFC 1414 表示
[]
rvalue 应该具有 'static
生命周期,这样不可变借用就可以进行借用检查,但是示例显示了一个可变借用!似乎有两种可能情况:
- 要么
[]
是一个临时变量(以便可以进行可变使用),在这种情况下它将没有'static
生命周期,因此不应进行借用检查; - 或者
[]
具有'static
生命周期,因此不应该出现可变借用(因为我们在进行借用时不保证独占访问权),也不应进行借用检查。
我漏掉了什么?
相关:
-
这个问题关注的是不可变引用;而这个问题则涉及到可变引用。
-
这个问题关注的是函数内部获取引用;而这个问题则涉及到返回引用。
[]
是一个字面量,因此是静态分配的,我猜这可能是其中的一部分。但是为什么我们能够对常见结构取可变引用呢?可变引用应该是排他的... - Aidan Cully