【发布时间】:2026-01-22 06:05:02
【问题描述】:
我有以下代码,它采用管道传输的文本行并记录键入某些字符所需的手指运动。 LogReport 采用 &KeyLoggers,其中存储了详细信息。 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 方法是什么?
【问题讨论】:
-
KeyLogger和LogReport类型从何而来,log的类型定义是什么?包括一个可重现的例子是理想的。
标签: rust