2006/02/24(金)Rubyでコンソールから1文字入力

なつかしの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
OK キャンセル 確認 その他