ruby学習メモ

ブロックを利用したファイルのオープン、読み込み、クローズ

# ファイルをオープンしてクローズする
class File
  def File.open_and_process(*args)
    f = File.open(*args)
    yield f
    f.close
  end
end

File.open_and_process("testfile.txt", "r") do |file|
  # file はファイルオブジェクトが渡されます
  while line = file.gets
     puts line
  end
end

ブロック呼び出し、ブロックなし呼び出しの判定 Kernel.block_given?

# ファイルをオープンしてクローズする
class File
  def File.test_open(*args)
    result = f = File.open(*args)
    # ブロックつきならファイルオブジェクトを渡し、
    # ブロックから復帰したらファイルをクローズする
    if block_given?
      puts "block_given!!"
      result = yield f
    else
      puts "no block_given..."
    end
    return result
  end
end
ブロック付きで呼び出した場合 "block_given!!" が表示される
irb(main):125:0* File.test_open("testfile.txt", "r") do |file|
irb(main):126:1*   # file はファイルオブジェクトが渡されます
irb(main):127:1*   while line = file.gets
irb(main):128:2>      puts line
irb(main):129:2>   end
irb(main):130:1> end
block_given!!
this is test
hello world!
=> nil
ブロックなしで呼び出した場合 "no block_given..." が表示される
irb(main):132:0* File.test_open("testfile.txt", "r")
no block_given...
=> #<File:testfile.txt>