小编Mat*_*ete的帖子

从标准输入读取而不阻塞

我正在编写一个需要显式解析所有键盘输入的 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 上仍有可用的数据)。

谢谢!

python stdin blocking

5
推荐指数
1
解决办法
340
查看次数

Rust 相对数组索引

我是一名相当高级的程序员(有 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 中实现所需的行为。

unsigned-integer rust integer-arithmetic

0
推荐指数
1
解决办法
103
查看次数