On Thu, Oct 29, 2009 at 2:14 PM, Benoit Daloze <eregontp / gmail.com> wrote: > Hi rubyists, > > I was just wondering why, > > (1..4).inject(&:+) #=> 10 > > works ? (in Ruby 1.9.2) > > I understand easily these: > > (1..4).inject { |s, e| s + e } #=> 10 > (1..4).inject(:+) #=> 10 > > I suppose it's calling :+.to_proc #=> #<Proc:0x2f52d8> > > irb> def a(&b); b; end > irb> a(&:+) > => #<Proc:0x2f52d8> > irb> :+.to_proc > => #<Proc:0x2f52d8> > > irb> p = a(&:+) > => #<Proc:0x2f52d8> > irb> p.arity > => -1 > irb> p.call(1,2) > => 3 > irb> p.call(1) > ArgumentError: wrong number of arguments(0 for 1) > .. > irb> p.call(1,2,3) > ArgumentError: wrong number of arguments(2 for 1) > ... > irb> p.call > ArgumentError: no receiver given > > Well, that's strange: arity = -1, so normally only optional arguments. And > it expects 1 argument but want 2 ? > "no receiver given" : That means it knows it has a argument to act on like > a.+(b). How come ? > Would &:+ knows it need some object to act with "+"(o) ? irb(main):001:0> 1.send(:+) ArgumentError: wrong number of arguments(0 for 1) from (irb):1:in `+' from (irb):1 from /Users/rick/.rvm/ruby-1.9.1-p243/bin/irb:12:in `<main>' irb(main):002:0> 1.send(:+, 2) => 3 irb(main):003:0> 1.send(:+, 2, 3) ArgumentError: wrong number of arguments(2 for 1) from (irb):3:in `+' from (irb):3 from /Users/rick/.rvm/ruby-1.9.1-p243/bin/irb:12:in `<main>' -- Rick DeNatale Blog: http://talklikeaduck.denhaven2.com/ Twitter: http://twitter.com/RickDeNatale WWR: http://www.workingwithrails.com/person/9021-rick-denatale LinkedIn: http://www.linkedin.com/in/rickdenatale