読者です 読者をやめる 読者になる 読者になる

Bonkura - Kenny

SIerで働く文系SEの記録

【たのしいRuby_11】ブロック

たのしいRubyの第11章を学んだ。

たのしいRuby 第4版

たのしいRuby 第4版

ファイルオブジェクト

システム上のファイルを読み書きするためのオブジェクト

file = File.open("sample.txt")
file.each_line do |line|
 print line
end
file.close

# each_line:1行づつ
# each_char:1文字づつ
# each_byte:1バイトづる

イテレータ以外のブロックの使い方

File.openメソッド(自動的にファイルが閉じられる)

File.openメソッドは、ブロックを受け取るとファイルオブジェクトをブロック変数として一度だけブロックを起動する。

File.open("hosts") do |file|
  file.each_line do |line|
    puts line
  end
end

# File#closeを書く必要がない。

ブロック付きメソッドを作る

def total(from,to)
  result = 0
  from.upto(to) do |num|
    if block_given?
      result += yield(num)
    else
      result += num
    end
  end
  return result
end

p total(1,10)
p total(1,10) { |num| num ** 2 }
  • yieldに引数を渡すと、その値がブロック変数としてブロックに渡り、ブロックを実行した結果がyieldの結果として戻ってくる。
  • block_given? は、ブロックが与えられている場合はtrue、与えられていない場合はfalseを返す。

ブロックの実行制御

n = total(1,10) do |num|
  if num == 5
    break
  end
  num
end

p n #=> nilになる
  • ブロックの中でbreakを呼ぶとブロック付き呼び出しの場所まで戻ってくる為、totalメソッドの中で計算の結果を返す処理が全て飛ばされる。

Procオブジェクト

ブロックをオブジェクトとして持ち運ぶ為のクラス。

hello = Proc.new do |name|
  puts "Hello, #{name}."
end

hello.call("World")
hello.call("Ruby")