From: Brian McCallister Date: 2005-03-24T06:10:30+09:00 Subject: Block Passing and &foo Parameters My understanding of the ¶meter syntax is that it just wraps a passed block in a proc: irb(main):003:0> def one(&func) irb(main):004:1> func.call irb(main):005:1> end => nil irb(main):006:0> one { puts 1 } 1 => nil irb(main):007:0> What would break if we had the ¶m parameter actually act as a declared parameter which must still be at the end: irb(main):008:0> one(lambda {puts 1}) ArgumentError: wrong number of arguments (1 for 0) from (irb):8:in `one' from (irb):8 from :0 irb(main):009:0> You can approximate this now with a default for the argument: irb(main):011:0> def two(func = lambda { yield }) irb(main):012:1> func.call irb(main):013:1> end => nil irb(main):014:0> two { puts 1} 1 => nil irb(main):015:0> two(lambda { puts 2} ) 2 => nil irb(main):016:0> The advantage to something like this is if you have one function you want to pass to a number of things, such as lists: irb(main):016:0> a = [1,2,3] => [1, 2, 3] irb(main):017:0> b = [4,5,6] => [4, 5, 6] irb(main):018:0> func = lambda {|i| puts i} => # irb(main):019:0> a.each func ArgumentError: wrong number of arguments (1 for 0) from (irb):19:in `each' from (irb):19 from :0 irb(main):020:0> b.each func ArgumentError: wrong number of arguments (1 for 0) from (irb):20:in `each' from (irb):20 from :0 irb(main):021:0> You can add this now via: irb(main):031:0> class Array irb(main):032:1> alias old_each each irb(main):033:1> def each(func = lambda {|i| yield i}) irb(main):034:2> old_each {|i| func.call i} irb(main):035:2> end irb(main):036:1> end => nil irb(main):037:0> [1,2,3].each func 1 2 3 => [1, 2, 3] irb(main):038:0> What would break if a special case allowed for passing of a Proc in the place of ¶m in place of passing in a block? -Brian