文档是否提到在函数参数前面添加"mut"关键字的可能性?



我有一个封装一些通用元素的基本Reader

pub struct Reader<R> {
inner: R,
order: Endian,
first_ifd_offset: usize,
}
impl<R: Read + Seek> Reader<R> {
pub fn new(reader: R) -> Result<Reader<R>> {
let mut order_raw = [0, 0];
reader.read_exact(&mut order_raw)?;
let magic_number = u16::to_be(u16::from_bytes(order_raw));
/* ... */
}
}

这不会编译并产生以下错误:

error[E0596]: cannot borrow immutable argument `reader` as mutable
--> src/reader.rs:17:9
|
15 |     pub fn new(reader: R) -> Result<Reader<R>> {
|                ------ consider changing this to `mut reader`
16 |         let mut order_raw = [0, 0];
17 |         reader.read_exact(&mut order_raw)?;
|         ^^^^^^ cannot borrow mutably

由于我按值获取参数,因此new函数应该是reader元素的新所有者。编译器建议我在函数参数前面添加一个mut关键字。

文档是否提到在函数参数前面添加mut关键字的可能性?我找不到提到它的资源。

标准库的BufReader结构具有 类似的new函数,不使用mut关键字而是使用unsafe正文中的块代码。unsafe是否会阻止在函数签名中使用mut

这是隐含的,但在书中没有直接提及。let和函数参数都是模式,所以就像你可以在let中使用mut一样,你可以在参数中使用它。

我认为编译器在说在哪里添加mut方面非常精确。通常,编译器会尝试为特定位置添加下划线:

pub fn new(mut reader: R) -> Result<Reader<R>>

现在可以在函数中改变读取器。其行为如下:

pub fn new(reader: R) -> Result<Reader<R>, Error> {
let mut reader = reader;
// ...

据我所知,它在书中只提到过一次,但或多或少在意义上它是一种模式,你也可以在函数中使用它

unsafe没有修复它,它是 UB:

改变不可变数据,即通过共享引用访问的数据或let绑定拥有的数据(,除非该数据包含在UnsafeCell<U>中。

最新更新