なつかしのC言語だとgetch()あたりで簡単に出来るコンソールからの直接1文字入力。Rubyの標準機能だとどれを使ってもEnterを押されるまで読み込めない。別に我慢すればいいような話なのだが、ちょっと挑戦。
・解決案1(不採用) 添付ライブラリcursesを使う。Winでもunixでも動くには動きそうだが、表示とかが機種依存ぽいので止め。
・解決案2(採用) Win32API+crtdll.dllを使う。もちろんwin32限定だが、その範囲に限れば最も機種依存度低そう。(msvcrt.dllよりもcrtdll.dllの方が汎用性高いという認識で合ってるよね?)
ということで解決案2でGO。
こんなふうに書いてみた。
require 'Win32API'
func_getch = Win32API.new('crtdll.dll', '_getch', 'v', 'i')
str = "Do you like skate? [y/N]\n"
print str
while true do
x = func_getch.call.chr.downcase
case x
when 'y'
#yesの時の処理
print "Ok!\n"
break
when 'n', "\r"
#noの時の処理(デフォルト)
print "Terrible!\n"
break
when "\C-c"
#getchでコンソールを奪うと中断出来ないので
exit
else
print str
end
end
如何にも古い人のコードだが気にしないで欲しい。
Win32API->crtdll.dll経由で_getchを呼び出す。_getchはエコーしないのであとは入力された文字で処理を分けてやるだけ。
意外と簡単に書けたけど…… こんなの使うのかな?
[参考URL]
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/6991