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に丸投げしたので、かなりあっさりした作りになっています。