blog.waterlow.work

Ruby, Rails, js, etc...

【Ruby】メソッドに複数ブロックを渡す。1

前回の復習

動的プログラミングとは
Rubyにはすでに定義されているクラス定義や、クラス定義に含まれるメソッド定義をプログラム実行時に変更することができる。同名のクラスの定義式をもう一度書くことによってクラスがオープンされ、自然な形でメソッドの追加ができる。method_missingは呼び出されたメソッドが存在しない場合の処理(通常はエラー)を変更できる。evalメソッドはメソッドが呼び出された時に式を評価(メソッドの定義式の追記みたいなもの?)ができる。

8-1 Procクラス

なんだそれ?
→メソッドを呼び出すときにブロックを渡していた(eachとかmapとか)。あのブロックはProcオブジェクトと言うもの。
手続きオブジェクトとも。

よく知られているメソッド呼び出しのときの使い方の他にwhen節での使い方がある。===メソッドで引数が与えられた条件を満たすか判定できる。

def what_class(obj)
  case obj
  when proc {|x| x.kind_of? String}
    String
  when proc {|x| x.kind_of? Numeric}
    Numeric
  else
    Class
  end
end

p what_class "aaaaa" #=>String
# when節ではこんな式評価が行われている。
p proc {|x| x.kind_of? String} === "aaaaa" #=>true

yield
少しだけ復習。
yieldを書いておくとメソッド実行時にブロックを渡せる。というかこのままだと渡さないとメソッドを呼び出せない。

def block_method
  p "1"
  yield
  p "3"
end

block_method do
  p "olso 2"
end

curry
f(x, y)からg(x) := f(1, x)を作るイメージ。サンプルは略。