我目前正在学习使用Ruby和curses库,并且尝试制作一个可以接受两个字符并退出的简单应用程序。但是,对于对象的“窗口”实例和Curses实例之间的区别,我有些困惑。
例如,我下面的脚本尝试以两种方式使用库的“获取”功能:一种使用Curses::getch
,另一种使用$window.getch
def init_curses()
Curses::init_screen
win = Curses::Window.new( Curses.lines, Curses.cols, #Set window to be as large as terminal window
0, 0) #Start window on top-left corner
win.clear
return win
end
$window = init_curses
input_ch = nil
begin
Curses::crmode
$window.addstr(INPUT_STR)
# Changing the order of these two lines
# changes what I see on the screen
Curses::refresh
$window.refresh
# Read characters using different methods
input_ch = $window.getch
input_ch = Curses::getch
ensure
$window.clear #Prevent output after exiting
$window.close
Curses::close_screen
end
当我更改呼叫的刷新顺序(现在在$window.refresh
之前呼叫Curses::refresh
时,屏幕上没有任何显示。
这是为什么?
此外,还有一些获取输入的首选方法吗?我应该通过window.getch
还是Curses::getch
获得输入?每种都有优点和缺点吗?
答案 0 :(得分:0)
Ruby的curses只是C curses库的接口。
诅咒 windows 通常小于屏幕。在诅咒中,作为一种特殊情况,存在一个预定义的窗口 stdscr
,它对应于整个屏幕。
在每种情况下(用户定义的窗口或特殊窗口 stdscr
),您都可以使用getch
来读取“从“窗口。这意味着在从窗口读取时,curses将光标移动到该窗口的当前位置(对于该窗口),并且取决于选项,可能会回显输入字符。另外(由于移动和回声),curses使用refresh
使窗口保持最新状态。