我是Rust的新手,需要一些帮助,因为我不知道为什么这个简单的代码不起作用。
我正在使用rdev库,我只是试图将键入的键存储在缓冲区中,并在按退格键时删除最后一个字母。
奇怪的是,退格键正确触发,但当调用pop()
方法时什么也没有发生,因此我想知道这里出了什么问题?.clear()
方法似乎工作正常。
我使用的是rdev =“0.5.2”
use rdev::{listen, Event, EventType, Key};
use std::sync::{Arc, Mutex};
#[derive(Default)]
struct AppState {
buffer: String,
}
fn handle_key(app_state: &mut AppState, event: &Event) {
if let Some(ref string) = event.name {
app_state.buffer.push_str(string);
}
else if let EventType::KeyRelease(key) = event.event_type {
if key == Key::Backspace {
app_state.buffer.pop();
}
if key == Key::Escape {
app_state.buffer.clear()
}
println!("buffer : {}", app_state.buffer);
}
}
#[tokio::main]
async fn main() {
let app_state = Arc::new(Mutex::new(AppState::default()));
let callback = {
move |event: Event| {
let mut app_state = app_state.lock().unwrap();
handle_key(&mut app_state, &event);
}
};
if let Err(error) = listen(callback) {
println!("Error: {:?}", error)
}
}
谢谢你的帮助关于这一点.另外,如果你认为有一个更好的方法来存储按下的键让我知道.也许有一种方法来存储键,并检查如果用户删除不仅是最后一个键,但也可能是在一个词的中间键,例如.
1条答案
按热度按时间g52tjvyc1#
实际上,
buffer.pop
可以工作,但问题出在backspace上。根据您的逻辑,当您按下backspace时,带有backspace(Ascii code 08
)的KeyPress
事件首先到达并插入到缓冲区中。然后当您释放键时,您的代码单独处理KeyRelease
,这就是您弹出最后一个08
的地方。您可以使用退格键进行双弹出,或者在按退格键时尽量避免插入字符串。
**Double pop:**如果再增加一个
pop
操作,就可以得到想要的结果:或者更好的选择:
避免退格键插入缓冲区:
第三种方法是重构代码以处理
KeyPress
,如果是printable
字符,则插入该字符,并避免其余字符。