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