あと、メソッドを一時的に変数に束縛したい場合には

http://d.hatena.ne.jp/yarb/20081117/p1
もう分かっているかもしれませんが、proc(またはlambda)で包むとメソッドを実行するためのブロックオブジェクトを作成することができます。
これを使うと、FileUtils.cpとFileUtils.mvのどちらを使うかの振り分けを動的に行うことができます。
例えば、こんな感じに

def func(foo)
  case foo
  when :sin then proc{ |n| Math.sin(n)}
  when :cos then proc{ |n| Math.cos(n)}
  end
end

f = func(:sin)
g = func(:cos)
g.call(Math::PI) # => -1.0
Math.cos(Math::PI) # => -1.0

f.call(Math::PI) # => 1.22464679914735e-16
Math.sin(Math::PI) # => 1.22464679914735e-16

この例では

  • fという変数にMath.cosを使うためのブロックオブジェクト
  • gという変数にMath.sinを使うためのブロックオブジェクト

を格納しています。
ただし、ブロックオブジェクトを呼び出す時には,Proc#call(またはblock.(), block[])を利用する必要があります。