to_proc
Procオブジェクトでなくても、to_procメソッドを持っているオブジェクトなら、&で修飾した引数としてメソッドに渡すことができます。
class Rubyco def to_proc proc { puts "Hello" } end end def rubyco(&block) block.call end rubyco(&Rubyco.new) #=> Hello
無理矢理trueをブロック仕立てにしたりして。
def true.to_proc proc { puts "Hello" } end def rubyco(&block) block.call end rubyco(&true) #=> Hello
無理矢理nilをブロック仕立てにしたりして…ってあれれ?callがないって言われちゃいました。
def nil.to_proc proc { puts "Hello" } end def rubyco(&block) block.call #=> undefined method `call' for nil:NilClass (NoMethodError) end rubyco(&nil)
nilはなぜかto_procだけでは駄目みたいですね。よくわかりませんが。
追記:ささださんからコメント。そうか、そうですね。nilはブロックを渡さないことを示しているんですものね。おもしろいのは、特異メソッドでnilにcallを定義すると呼べてしまうこと。このとき、to_procが定義されていなくてもよい。
def nil.call puts "Hello" end def rubyco(&block) block.call end rubyco(&nil) #=> Hello