LINUX.ORG.RU

Еще одна проблема с Termion

 


0

2

В общем вот код:

    for c in stdin.keys() {
        write!(stdout, "{}", termion::clear::CurrentLine).unwrap();
        match c.unwrap(){
            Key::Char('s') => {
                stdout.flush().unwrap();
                println!("Type path to file:\r");
                let mut musicpath = stdout.write_all(b"path:").unwrap();
                
                
        },
            
            Key::Char('q') => break,
            _ => {
                termion::clear::CurrentLine;
                print!("You entered wrong combination\r")
            }
                                                
        }   
       stdout.flush().unwrap();
    }
   
}
По сути после нажатия «S» я могу ввести место нахождения файла, но программа все еще считывает нажатия клавиш и проверяет их по match c.unwrap(),есть возможность как то обойти данную проблему?

★★

Последнее исправление: playX (всего исправлений: 1)

По сути после нажатия «S» я могу ввести место нахождения файла

не наблюдаю обработки ввода после 'S'

Dark_SavanT ★★★★★
()
Ответ на: комментарий от playX

я могу ввести место нахождения файла,

Вот этого в тексте нету.
Есть только обработка «c in stdin.keys()»
А где «read_line()»?

WatchCat ★★★★★
()

так это, FSM минимальную сделай. Переключай обработчик после нажатия s и все дела.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от WatchCat

Зачем в данном случае read_line? В let mut musicpath = stdout.write_all(b"path:").unwrap() write_all как раз отвечает за ввод, так что тут можно ввести что либо, но опять же из-за вышеуказаной ошибки не выходит

playX ★★
() автор топика
Ответ на: комментарий от playX

Дока:

Attempts to write an entire buffer into this write.

Где тут про считывание введенной тобой строки? ну и сигнатура

fn write_all(&mut self, buf: &[u8]) -> Result<()>

намекает что у тебя там будет Void или че там в ржавом.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Тебе намекнули, что приведенного кода недостаточно. А вообще похоже, что тебе нужна старая добрая переменная-флаг. Если флаг установлен в true, матчим нажатия клавиш, в false - игнорируем.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

С этим уже посложнее будет разобраться, ведь как можно будет изменять эту переменную если клавиши будут не матчится, можно конечно все реализовать через

let mut input = String::new();
,но это надо признать не так удобно как нажатие одной клавиши

playX ★★
() автор топика
Последнее исправление: playX (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

write! это почти то же самое что и print!, writeln это тот же println!. С помощью write_all должна быть возможность реализовать ввод слов, букв и т.п

playX ★★
() автор топика
Ответ на: комментарий от Deleted

Не игнорю, я пока пытаюсь и по твоей схеме сделать так же, но как я понял это не обязательная вещь, ведь в одном из примере программ на термионе была такая же строка с write_all и отдельную функцию там не городили:https://github.com/ticki/termion/blob/master/examples/read.rs

playX ★★
() автор топика
Последнее исправление: playX (всего исправлений: 1)
Ответ на: комментарий от Deleted

В таком случае я ошибся, но опять же способ с String::new() тоже не работает ибо все еще функционирует match c.unwrap()

playX ★★
() автор топика
Ответ на: комментарий от playX

let mut musicpath = stdout.write_all(b"path:").unwrap();

stdout это std::io::Stdout ?
Если да, то где там ввод данных если это вывод данных? И результатом будет Result<()>, т.е. musicpath будет пустым типом
Если нет, то приведи более полный код, а то я не телепат да и разбираться в типах по куску кода меня как-то напрягает.

WatchCat ★★★★★
()
Последнее исправление: WatchCat (всего исправлений: 1)
Ответ на: комментарий от playX

Кхм, а ты вообще код компилируешь перед коммитами в репу? Я запустил его в плейграунде и поимел кучу ворнингов. К тому же, после первой ветки в match пропущена запятая. Это я и так заметил.

Каким образом ты собираешься добиваться работоспособности кода при таких очевидных проблемах с подходом к его написанию? На доках и примерах рассчитываешь выехать?

Мрак, кромешный мрак.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)
Ответ на: комментарий от playX

Мне представляется проблема в ".keys()".
Т.е. итератор возможно как-то блокирует устройство и пока его не освободит, то через новую структуру мы его прочитать не сможем.
Тут надо лезть в потроха этого самого termion::input::Keys.

WatchCat ★★★★★
()
Ответ на: комментарий от WatchCat

Ну я там наверное ничего сам изменить нормально не смогу, самый лучший вариант это просто создать issue на github репозитории termion'a

playX ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.