У меня есть следующий код для чтения клавиш ввода пользователя с терминала с помощью termion
use std::io::{stdin, stdout};
use termion::event::Key;
fn main() {
let mut stdout = stdout().into_raw_mode().unwrap();
let stdin = stdin();
let char_from_config = 'e';
for c in stdin.keys() {
match c.unwrap() {
Key::Char('q') => {
break;
}
Key::Char('h') => {
// do something
}
Key::Char('l') => {
// do something else
}
_ => {}
}
stdout.flush().unwrap();
}
}
Что бы я хотел сделать, так это прочитать не просто Key::Char('q'), а какое-то другое значение динамического символа, которое я собираю откуда-то еще, например Key::Char(char_from_config), но оно почему-то не работает.
Есть ли способ вставить переменную, содержащую char вместо фактического 'char', в match руки?





Когда вы пишете руку совпадения Key(c) => ..., c становится частью шаблона, с которым будет выполняться сопоставление, и если значение соответствует этому варианту перечисления, c будет равно тому, что содержит этот вариант. Однако вы хотите сказать «сопоставлять, только если это вариант Key с этим заданным значением». У вас есть два варианта, как это сделать.
const (вы, вероятно, не хотите этого делать):const CHAR_FROM_CONFIG: char = 'e';
match ... {
Key(CHAR_FROM_CONFIG) => (),
_ => ()
}
let char_from_config = 'e';
match ... {
// c will match here any character, but this arm will succeed only
// when it will be equal to char_from_config
Key(c) if c == char_from_config => (),
_ => ()
}