落書きノート

ふと自分が気になった事を書いてます

Ruby 練習問題 IOクラス

ここのセクションの練習問題も仕様上しづらい感じのものがあったので、それは答えを見て、それ以外は自分で解いてみました。

def wc(file)
  nline = nword = nchar = 0
  File.open(file){|io|
    io.each{|line|
      words = line.split(/\s+/).reject{|w| w.empty? }
      nline += 1
      nword += words.length
      nchar += line.length
    }
  }
  puts "lines = #{nline}, nword = #{nword}, nchar = #{nchar}"
end

wc(ARGV[0])

このプログラムは正直完璧じゃないなと思うんですけど、筆者の意図している動きらしいのでこれで良しとします。

def tee(input, *outputs)
  input.each{|line|
    outputs.each{|io| io.write(line) }
  }
end

open(__FILE__){|io|
  tee(io, $stdout, $stderr)
}

これもわかりづらい…。仕組みは理解したので良しとします。アスタリスクのついている引数は可変引数です。

def tail(line, filename)
  lineNO = 0

  while line_read = filename.gets
    lineNO += 1
  end

  line = lineNO - line
  filename.rewind
  lineNO = 0

  while line_read = filename.gets
    if lineNO >= line then
        puts line_read
    end

    lineNO += 1
  end
end

File.open(ARGV[0]){|io|
  tail(10, io)
}

これは自分で解けました。唯一まともに出来たような…。