Lua - Можно ли остановить входы, пока работает ex.sleep? - PullRequest
0 голосов
/ 25 декабря 2018

Основные вещи, которые я не могу найти или найти в интернете: маленький код, который я использую для тестов, прост:

require("ex")

a = true
b = nil

while (a == true) do
    b = io.read()
    ex.sleep(5)
    print(b)
end

Очень просто.Если я введу «1» ( Я использую Notepad ++ и командную строку Windows ), он будет ждать 5 секунд и распечатывать его, а затем повторить.Но моя проблема в том, что ... если я введу больше чисел в течение 5 секунд сна, все это будет выполнено автоматически по порядку, когда сон закончится.

Можно ли это остановить?Я не хочу, чтобы какой-либо ввод читался в течение этого времени.Где хранятся эти «призрачные» входы?

1 Ответ

0 голосов
/ 25 декабря 2018

Вы можете контролировать чтение с помощью аргумента «размер буфера» в байтах:

b = io.read(1)

В этом случае чтение завершается после того, как первый байт был взят из ввода.Остальные входные байты будут доступны для следующего оператора «read».Важное примечание: если вы введете «1» и нажмете «Enter», для чтения будет 3 байта (включая «\ r \ n»).

Подробнее см. https://www.lua.org/pil/21.1.html.

Кроме того, вы хотите знать способ очистки входного буфера перед следующим чтением.Это просто: используйте оператор io.read ("* line") следующим образом:

b = io.read("*line")  -- suppose, input is: "1234"
b = string.sub(b, 0, 1)
print(b)              -- prints 1

b = io.read("*line")  -- suppose, input is: "567"
b = string.sub(b, 0, 1)
print(b)              -- prints 5

b = io.read("*line")  -- suppose, input is: ""
b = string.sub(b, 0, 1)
print(b)              -- prints empty string

io.read ("* line") получает целую строку из ввода, но вы можете взять только первый символиз него.

...