プロを目指す人のためのRuby入門・第10章重要ポイントまとめ

「プロを目指す人のためのRuby入門」の第10章を読み終わりました

個人的に重要と判断したポイントをまとめます。

yieldについて


yieldはブロックに引数を渡したり、ブロックの戻り値を受け取ることができます。

def greeting
  puts 'おはよう'
  #ブロックの意味を確認してからyieldを呼び出す
  if block_given?
    text = yield 'こんにちは'
    puts text
  end
  puts 'こんばんは'
end

#ブロックをつけてメソッドを呼び出す
greeting do |text|
  text * 2
end

#=> おはよう
#      こんにちはこんにちは
#      こんばんは
Procクラス


Procクラスはブロック(何らかの処理のかたまり)をオブジェクト化するためのクラスです。
Procオブジェクトを作成するには、Proc.newもしくはKernelモジュールのprocメソッドが使えます。
callメソッドでProcメソッドを実行できます。

#Proc.newで"Hello!"という文字列を返すProcオブジェクトを作成する
hello_proc = Proc.new do
  'Hello!'
end

#callメソッドを呼び出してProcオブジェクトを実行する
hello_proc.call #=> "Hello!"


#Kernelモジュールのprocメソッドを使ってProcオブジェクトを作成する
add_proc = proc { |a, b| a + b }
#callメソッドでProcオブジェクトの実行
add_proc.call(2, 3) #=> 5
ブロックに対するProcオブジェクトの優位性


・Procオブジェクトはオブジェクトとして扱うことができる(ブロックはただの処理のかたまり)

def greeting(&block)
  #オブジェクトとして扱えるため、メソッドの呼び出しと変数への代入が可能
  text = block.call('こんにちは')
  puts text
end

greeting do |text|
  text * 2
end
#=> "こんにちはこんにちは"


・メソッドの引数としてProcオブジェクトを渡せる数に制限がない(ブロックは1つのメソッドに1つだけ)

#メソッドの引数として3種類のProcオブジェクトを渡す
def greeting(proc_1, proc_2, proc_3)
  puts proc_1.call('おはよう')
  puts proc_2.call('こんにちは')
  puts proc_3.call('こんばんは')
end

#Procオブジェクトを用意する
shuffle_proc = Proc.new { |text| text.chars.shuffle.join }
repeat_proc = Proc.new { |text| text * 2 }
question_proc = Proc.new { |text| "#{text}?" }

#Procオブジェクトを渡し、メソッドを実行する
greeting(shuffle_proc, repeat_proc, question_proc)
#=> ようはお
#      こんにちはこんにちは
#      こんばんは?


感想
処理のかたまりがオブジェクトととして扱えるという考え方に早く慣れたいと思います!