コマンドラインで対話するためのクラスを作ってみた。
http://doc.loveruby.net/refm/api/view/class/Timeout
を参考にした。
リファレンスに書かれているように何秒かするとタイムアウトし終了するようにした。$stdin で受けとる文字列が yes or no の場合と、数字の場合と、アルファベットなど文字を1文字の場合とを用意してみた。timeout() は、require 'timeout'しないと使えないけれど、もしもほかの用事で require 'net/http' していたら require 'timeout' を書かなくても timeout() を使うことができた。
CommandLine.new().yesorno
y or yes のとき true をそれ以外の場合 false をかえす。
% ruby19 -rmyttymess.rb -ve "Myttymess::CommandLine.new().yesorno"
ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]
Please Select [y/n]:
y
true
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().yesorno"
Please Select [y/n]:
n
false
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().yesorno"
Please Select [y/n]:
a
false
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().yesorno"
Please Select [y/n]:
Timeout...bye.
false
CommandLine.new().character
1つの文字であればその文字を返し、そうでない場合 false が返る。数字の場合も1桁の数字ならok。
ruby 1.9 の場合 日本語の「あ」も1文字と解釈してくれた。
ruby 1.8.6 の場合は false になった。
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().character"
Please input one char:
a
"a"
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().character"
Please input one char:
abc
false
% ruby19 -rmyttymess.rb -ve "Myttymess::CommandLine.new().character"
ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]
Please input one char:
あ
"あ"
% ruby -rmyttymess.rb -ve "Myttymess::CommandLine.new().character"
ruby 1.8.6 (2008-03-03 patchlevel 114) [universal-darwin9.0]
Please input one char:
あ
false
CommandLine.new().number(max)
max に指定した数字以下なら入力された数字を それ以外の場合 falseを アルファベットなど文字の場合 false を
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
9
"9"
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
10
"10"
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
11
false
% ruby19 -rmyttymess.rb -e "Myttymess::CommandLine.new().number(10)"
Please Select Number:
a
false
myttymess.rb
1 #!/pathto/ruby19/bin/ruby
2 # -*- coding: utf-8 -*-
3
4 # myttymess.rb
5 # ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]
6 # 2008-12-06.
7
8 ######################################################
9 # reference:
10 # http://doc.loveruby.net/refm/api/view/class/Timeout
11 ######################################################
12
13 # if require 'net/http', unnecessarily require 'timeout'.
14 # 'net/http.rb' require 'net/protocol.rb'. 'net/protocol.rb' require 'timeout'.
15
16 require 'timeout'
17
18 module Myttymess
19
20 class MyError < Exception; end
21
22 class StdinGets
23
24 def interactive(mess, opt)
25 return false unless $stdin.tty? == true
26 print "#{mess}:\n"
27 ans = $stdin.gets.chop
28 m = /^y$|^yes$/.match(ans)
29 return false if /n/.match(ans) # n or no == stop
30 return false if ans.empty? # ans is String class
31 case opt
32 when true # yes or no
33 return false if m.nil?
34 return true
35 when false # return one character
36 return false if ans.size > 1
37 return ans
38 else # return number =< Max Number
39 return false if ans == "0"
40 return false if ans =~ /\D/
41 return false if ans.to_i > opt.to_i
42 return ans
43 end
44 end
45
46 def message(str,opt)
47 ans = ''
48 begin
49 timeout(5, MyError){ans = interactive(str, opt)}
50 rescue MyError => err
51 puts "Timeout...bye.\n"
52 return false
53 end
54 return ans
55 end
56
57 end
58
59 class CommandLine
60
61 def yesorno
62 str = "Please Select [y/n]"
63 p ans = StdinGets.new().message(str, true)
64 return ans
65 end
66
67 def number(max)
68 str = "Please Select Number"
69 p ans = StdinGets.new().message(str, max)
70 end
71
72 def character
73 str = "Please input one char"
74 p ans = StdinGets.new().message(str, false)
75 end
76
77 end
78
79 end
80
81 #Myttymess::CommandLine.new().yesorno
82 #Myttymess::CommandLine.new().number(max)
83 #Myttymess::CommandLine.new().character
--imported_from
http://www.midore.net/daybook/2008/12/1228833000.html
0 件のコメント:
コメントを投稿