rust - 不能将 x 作为可变借用,因为它也作为不可变错误借用
问题描述
我有以下代码,它采用管道文本行并记录键入某些字符所需的手指运动。LogReport
需要&KeyLogger
存储详细信息的 s。LogReport
稍后将多个详细信息打印&KeyLogger
为目录。
let keyboard = KeyboardBuilder::build(...);
let mut key_logger: KeyLogger = KeyLogger::new(keyboard);
let mut report = LogReport::new();
report.add_logger(String::from("QWERTY"), &key_logger);
loop {
let mut input = String::new();
match io::stdin().read_line(&mut input) {
Ok(len) => {
if len == 0 {
return;
} else {
input.chars().for_each(|char| key_logger.log(&char));
report.print();
}
}
Err(error) => {
eprintln!("error: {}", error);
return;
}
}
}
编译错误很清楚,可以理解问题,但如何解决问题?我想我将不得不找到一个解决方案,仅在记录管道文本后才打印报告,但无论如何问题仍然存在。
error[E0502]: cannot borrow `key_logger` as mutable because it is also borrowed as immutable
--> src/main.rs:25:44
|
15 | report.add_logger(String::from("QWERTY"), &key_logger);
| ----------- immutable borrow occurs here
...
25 | input.chars().for_each(|char| key_logger.log(&char));
| ^^^^^^ ---------- second borrow occurs due to use of `key_logger` in closure
| |
| mutable borrow occurs here
26 | report.print();
| ------ immutable borrow later used here
即使第一个不可变借用更改为可变,编译器仍然会抱怨cannot borrow key_logger as mutable more than once at a time
. 处理这种情况的 Rust 方法是什么?
解决方案
正如您所指出的,由于 Rust 的所有权规则,您不能在以后可变借用之前将键盘记录器借用为不可变或可变的。
如果您在以后使用之前必须在 LogReport 中引用键盘记录器,您有几个选择。
- 您可以将键盘记录器的所有权传递给日志报告,并从中可变地借用。
- 您可以使用内部可变性(Rc 和 RefCell)来共享所有权。
- 您可以改为为每个键盘记录器分配一个索引并将它们存储在某处,然后稍后按索引查找。
- unsafe 可能会起作用,但非常非常不必要。
我个人会选择选项#1。
推荐阅读
- wordpress - htaccess 重定向,同时通过 tld 更改移动到子域下的多站点
- shell - 如何使用脚本从 linux 中的用户主目录压缩根文件夹 (/usr/)
- python - 打印文件中的前 3 个分数和后 3 个分数
- ansible - Ansible delegate_to 关键字 - 我可以将任务委托给清单中定义的组而不是特定主机吗?
- python - 如何摆脱无输出?
- python - 试图找到一种巧妙的方法来处理python中的排列输入
- c# - 如何检查两个对撞机改变这三个对象的颜色,而不是其他具有相同脚本的实例?
- linux - x86 汇编输入和输出
- html - 使用 Mailkit 在 .Net Core Application 中使用 Html 模板发送电子邮件
- angular - Angular 9 - [routerlink] 到实际网址(但添加查询参数)?