我正在编写一个需要显式解析所有键盘输入的 python 应用程序。因此我写了一个小循环,不断从标准输入读取。这工作正常,但是, stdin.read(1) 会阻塞,直到我们键入一个字符。现在我希望它在(例如)1 秒后超时,以便其他事情可能发生。我在 python 中阅读了 select 模块,现在我有以下内容:
def getch(timeout):
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
ch = None
try:
tty.setraw(fd)
rlist, _, _ = select([sys.stdin], [], [], timeout)
if len(rlist) > 0:
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
Run Code Online (Sandbox Code Playgroud)
这段代码的问题是,当我按下箭头键时,我只收到“\x1b”。select 函数永远不会为剩余的 '[' 和 'D' 触发。
如何正确读取这些箭头键字符?或者我怎样才能再次触发 select 函数(因为 stdin 上仍有可用的数据)。
谢谢!
我是一名相当高级的程序员(有 Java、Python、C#、C、C++ 经验),现在第一次尝试学习 Rust。Rust 与我之前尝试过的任何语言都非常不同,所以我很挣扎。为了了解这门语言,我正在实现一个小游戏。
在我的代码中的某个时刻,我想访问“板”中的一个元素和周围的元素。如果我的元素位于板的边缘(索引 0 或索引最大值),我需要一个剪裁值(例如索引 0 - 1 == 0) 如果我简化这个用例,我会尝试从数组和相对索引。下面是一个非常小的例子:
fn get_elements(array: &Vec<char>, i: usize, dx: i8) -> (char, char) {
let center = array[i];
let other = array[i+dx];
(center, other)
}
fn main() {
let data = vec!['a', 'b', 'c', 'd', 'e'];
let (c, o) = get_elements(&data, 2, -1);
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,这无法编译,因为no implementation for `usize + i8` . 我理解这是因为对于无符号数来说,减去零以下的行为是未定义的。然而,我不清楚如何在 Rust 中实现所需的行为。