我有一个类似这样的fn
:
use std::io::Read;
fn read_something(file: &mut impl Read) {
let _ = file.read(&mut [0; 8]);
}
当我像这样将一个
Vec
的切片传递给它:fn main() {
let vector = vec![1, 2, 3, 4];
read_something(&mut &vector[..]);
}
它能够正常工作。但是当我先将切片保存到变量中时,它就无法编译:
fn main() {
let vector = vec![1, 2, 3, 4];
let slice = &vector[..];
read_something(&mut slice);
}
编译器告诉我,我
无法作为可变引用借用。
这两种情况有什么不同?
为什么第一个示例可以工作,即使 vector
没有声明为可变的?
如何将 &[u8]
切片传递给那个接受 &mut impl Read
的 fn
?
[first, last)
或<pointer, length>
的组合。正是这对组合是可变的,即允许更改其所指向的数据。这就是&mut &[u8]
的含义 - 对某些不可变数据的可变引用。它不允许您更改向量的内容,那将是&mut [u8]
或&mut &mut [u8]
等。 - user4815162342