Ruby勉強会@関西 #33 参加
久しぶりにRuby関西の勉強会に参加できました。かれこれ半年ぶり。
演習の解答はこんな感じ。演習1はある程度書いたけど省略(^^;
演習0
a = ARGV.shift.to_f b = ARGV.shift.to_f o = %w(+ - * /) o.each do |oo| puts eval("a #{oo} b") end
a = ARGV.shift.to_i ans = 0 1.upto(a) do |i| ans += i end puts ans
で、optparseを使った場合はこんな感じ。
#!ruby -Ks require 'optparse' def e01(opr) a = ARGV.shift.to_f b = ARGV.shift.to_f puts eval("a #{opr} b") end def e02(num) ans = 0 1.upto(num) do |i| ans += i end puts ans end if $0 == __FILE__ opt = OptionParser.new sw = nil n = 0 opr = '' opt.on('-s NUM', 'sum up to NUM'){ |v| sw = :sum; n = v.to_i } opt.on('-o OPE', 'operator is {+ - * /}') { |v| sw = :opr; opr = v.to_s } opt.parse! case sw when :opr e01(opr) when :sum e02(n) end end
演習2
とりあえず、-nオプションだけ。例によって、イマイチな実装です。
#!ruby -Ks require 'optparse' class Cat def initialize(io, opt={}) @io = io @line_no = 0 @opt = opt end def self.cat(io, opt={}) cat = self.new(io, opt) begin cat.exec rescue => e $stderr.puts e end end def exec while line = @io.gets do @line_no += 1 option_proc(line) puts line end end def option_proc(line) print "%06d:" % @line_no if @opt.key? :n end end if $0 == __FILE__ opts = {} OptionParser.new do |opt| opt.on('-n', 'number all output lines'){ opts[:n] = true } opt.parse! end Cat.cat(ARGF, opts) end
ARGFに丸投げしたので、かなりあっさりした作りになっています。