Ruby中的Window Getch与Curses Getch

时间:2018-08-05 14:39:45

标签: ruby curses

我目前正在学习使用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获得输入?每种都有优点和缺点吗?

1 个答案:

答案 0 :(得分:0)

Ruby的curses只是C curses库的接口。

诅咒 windows 通常小于屏幕。在诅咒中,作为一种特殊情况,存在一个预定义的窗口 stdscr ,它对应于整个屏幕。

在每种情况下(用户定义的窗口或特殊窗口 stdscr ),您都可以使用getch来读取“从“窗口。这意味着在从窗口读取时,curses将光标移动到该窗口的当前位置(对于该窗口),并且取决于选项,可能会回显输入字符。另外(由于移动和回声),curses使用refresh使窗口保持最新状态。