なんか書いていこうぜー .com

Let's write something good

Ruby の curses のドキュメント

2020-10-12
  • Share on Facebook
  • Tweet
  • Add to Pocket

最近 Ruby の curses を使って遊ぶことがあり、その中で Curses::Window#refreshCurses::Window#noutrefresh の違いがよくわからなかったので、ドキュメントを探していた。

日本語で探すと るりま が検索にかかるが、最新とは内容が離れているのでメモとして残しておく。

Ruby の curses のドキュメント

curses は Ruby 2.1.0 から標準ライブラリから切り出されて独立した gem になっている。see: https://github.com/ruby/curses#description

切り出されたことにより、curses のるりまは 1.8.7 の library curses でなくなって?おり、ruby/curses の README の Documentation にあるように www.rubydoc.info にあるものが最新を追随している公式ドキュメントになっている。

1.8.7 標準添付の curses から 現在の v1.3.2 までの間に API も増えているため、残念ながら 1.8.7 の情報では現在の curses を扱うのは難しい。

physical screen と virtual screen

Python の curses のドキュメント https://docs.python.org/3.5/library/curses.html にはより詳細に説明が記載されており、physical screen と virtual screen という語を使って説明されていた。単語が明確に分けて使われている英語のほうのドキュメントがおすすめです。

実際に私たちに見えるのは physical screen で、見えていないが変更内容を保持しているのが virtual screen で、virtual screen に対して変更したものを physical screen に同期するようなかたちで更新し、physical screen に反映して表示する仕組みな模様。

Curses::Window#refresh と Curses::Window#noutrefresh の違い

https://www.rubydoc.info/gems/curses/Curses/Window をみると、どちらも Curses::Window に設定した内容を更新するメソッドで、両メソッドの説明には Refresh the windows and lines. とある。

Curses::Window#noutrefresh は加えて、Curses::Window.noutrefresh allows multiple updates with more efficiency than Curses::Window.refresh alone. と書いてあるので、複数 Window がある場合に効率的に処理できるらしい。

#refresh は以下のように動くようだ。

  1. 仮想スクリーンに設定された内容を物理スクリーンに反映する
  2. 仮想スクリーンを

https://github.com/shugo/textbringer/blob/main/lib/textbringer/window.rb