名前付き無名関数
lambdaを生成する関数を多用すると、pで出力したlambdaが一体何をするlambdaなのかわかりにくくなる場合があります(通常lambdaをinspectするとファイル名と行番号は表示されるのですが、lambdaを生成する関数経由で生成すると同じファイル名、行番号になってしまいます)。
で、これを何とかしたいなぁと思って、以下のようにlambdaを置き換える関数を定義してみました。
module Kernel alias __lambda__ lambda def lambda(name = nil, &block) f = __lambda__(&block) if name f.instance_variable_set(:@name, name) def f.inspect super.chop + " @name=#{@name.inspect}>" end end f end end f1 = lambda {|a, b| a + b } p f1 # => #<Proc:0x02b36d00@a.rb:18> 普通にlambdaとして使えます。 p f1[10, 20] # => 30 f2 = lambda('add') {|a, b| a + b } p f2 # => #<Proc:0x02b369b8@a.rb:22 @name="add"> @nameが追加されます。 p f2[10, 20] # => 30
無名関数なのに名前付きというわけのわからないものになってしまいました。