rust - 文档是否提到在函数参数前添加“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
struct 也有类似的new
功能,在正文中不使用mut
关键字,而是使用unsafe
块代码。是否unsafe
阻止使用mut
内部函数的签名?
解决方案
我认为编译器非常精确地说明在哪里添加mut
. 通常,编译器会尝试在特定位置下划线:
pub fn new(mut reader: R) -> Result<Reader<R>>
现在可以在函数中改变阅读器。这表现为:
pub fn new(reader: R) -> Result<Reader<R>, Error> {
let mut reader = reader;
// ...
据我所知,它在书中只提到过一次,但或多或少是一种模式,你也可以在函数中使用它。
变异的非可变数据——即通过共享引用或
let
绑定拥有的数据到达的数据),除非该数据包含在UnsafeCell<U>
.
推荐阅读
- outlook-addin - 是否可以创建可下载的 Outlook Web 插件
- variables - woocommerce 获取可变产品属性
- asp.net-mvc - Delete Data Api with Table 关联了另一个表 .net Core
- node.js - JSX 支持不再适用于 gulp-eslint 5.0.0
- node.js - 你知道如何从 node.js 运行 xmlrpc 请求吗?
- excel - 将文本拆分为行
- c# - EmguCV MatchTemplate 获取所有匹配项
- python - 在弄清楚如何使用 Python 抓取实时流数据方面需要帮助
- windows - 如何使用批处理解析文件中每行的第一个单词—文件
- angular - Angular 6 组件中从下午到上午的时间转换