rust Buffer.clear()正在工作,但buffer.pop()没有工作

z0qdvdin  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(155)

我是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)
    }

}

谢谢你的帮助关于这一点.另外,如果你认为有一个更好的方法来存储按下的键让我知道.也许有一种方法来存储键,并检查如果用户删除不仅是最后一个键,但也可能是在一个词的中间键,例如.

g52tjvyc

g52tjvyc1#

实际上,buffer.pop可以工作,但问题出在backspace上。根据您的逻辑,当您按下backspace时,带有backspace(Ascii code 08)的KeyPress事件首先到达并插入到缓冲区中。然后当您释放键时,您的代码单独处理KeyRelease,这就是您弹出最后一个08的地方。
您可以使用退格键进行双弹出,或者在按退格键时尽量避免插入字符串。

**Double pop:**如果再增加一个pop操作,就可以得到想要的结果:

...
   ...
   if key == Key::Backspace {
      let c = app_state.buffer.pop();
      println!("C: {:#?}", c.unwrap());
      let c = app_state.buffer.pop();
      println!("C: {:#?}", c.unwrap());
    }
   ...
   ...

或者更好的选择:

避免退格键插入缓冲区

...
   ...
fn handle_key(app_state: &mut AppState, event: &Event) {
  if let Some(ref string) = event.name  {
    if "\u{0008}" != string {
      app_state.buffer.push_str(string);
    }
  }
  ...

第三种方法是重构代码以处理KeyPress,如果是printable字符,则插入该字符,并避免其余字符。

相关问题