Why do proc and lambda return different values for arity?
e.g.
proc { |x = 0| }.arity #=> 0
lambda { |a = 0| }.arity #=> -1
proc {
After reading the other 2 answers, my guess is that in #arity method is treading thin ice. For fixed number of ordered arguments, #arity used to be perfectly OK method. Then, when optional arguments were added, to stick with arity representation by a single integer, minus sign was exploited as a flag. But already, argument field information is being discarded, as eg. 1ary or 2ary -> a, b=1 { a + b } indicates same arity (-2) as -> a, *b { a + b.sum }, taking 1 to arbitrary number of arguments. After the change of #arity behavior in 1.9, another blow comes in 2.0, where named arguments are introduced, which go completely unnoticed by #arity. Again, there will be compulsory and optional named arguments, plus the possibility of collecting arbitrary number of them with hash splash **. I would expect #arity method to change its behavior again in the future...