# Why (1..4).inject(&:+) works?

**URL:** <https://www.ruby-forum.com/t/why-1-4-inject-works/178146>\
**Category:** Ruby\
**Created:** [October 29, 2009, 7:14pm UTC](https://www.ruby-forum.com/t/why-1-4-inject-works/178146 "2009-10-29T19:14:57Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![benoitdinocourt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/87869e/32.png) [@benoitdinocourt](https://www.ruby-forum.com/u/benoitdinocourt)\
**Post date:** [October 29, 2009, 7:14pm UTC](https://www.ruby-forum.com/t/why-1-4-inject-works/178146/1 "2009-10-29T19:14:57Z")

</div>

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) ?

Have a nice day

---

<div class="post-metadata">

**Author:** ![benoitdinocourt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/87869e/32.png) [@benoitdinocourt](https://www.ruby-forum.com/u/benoitdinocourt)\
**Post date:** [October 29, 2009, 7:23pm UTC](https://www.ruby-forum.com/t/why-1-4-inject-works/178146/2 "2009-10-29T19:23:44Z")

</div>

Hi,

Can anyone suggest a faster alternative to String.split()? I need to  
call it very intensively and its quite a hotspot. I’m using ruby 1.8.7.

Cheers,  
James

---

<div class="post-metadata">

**Author:** ![benoitdinocourt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/87869e/32.png) [@benoitdinocourt](https://www.ruby-forum.com/u/benoitdinocourt)\
**Post date:** [October 29, 2009, 7:30pm UTC](https://www.ruby-forum.com/t/why-1-4-inject-works/178146/3 "2009-10-29T19:30:45Z")

</div>

On Fri, Oct 30, 2009 at 03:23:01AM +0900, James F. wrote:

> Hi,
> 
> Can anyone suggest a faster alternative to String.split()? I need to call it very intensively and its quite a hotspot. I’m using ruby 1.8.7.
> 
> Cheers,  
> James

use ruby inline

---

<div class="post-metadata">

**Author:** ![benoitdinocourt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/87869e/32.png) [@benoitdinocourt](https://www.ruby-forum.com/u/benoitdinocourt)\
**Post date:** [October 29, 2009, 7:39pm UTC](https://www.ruby-forum.com/t/why-1-4-inject-works/178146/4 "2009-10-29T19:39:32Z")

</div>

> > Can anyone suggest a faster alternative to String.split()? I need to  
> > call it very intensively and its quite a hotspot. I’m using ruby 1.8.7.
> > 
> > Cheers,  
> > James
> 
> use ruby inline

Thanks for the link - was not aware of that. Will definitely look into  
that.

---

<div class="post-metadata">

**Author:** ![benoitdinocourt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/87869e/32.png) [@benoitdinocourt](https://www.ruby-forum.com/u/benoitdinocourt)\
**Post date:** [October 29, 2009, 8:04pm UTC](https://www.ruby-forum.com/t/why-1-4-inject-works/178146/5 "2009-10-29T20:04:43Z")

</div>

On Oct 29, 2009, at 11:23 , James F. wrote:

> Can anyone suggest a faster alternative to String.split()? I need to  
> call it very intensively and its quite a hotspot. I’m using ruby  
> 1.8.7.

I can suggest you not thread hijack anymore. It is rude and messes up  
people who use real mail clients. Start a new mail.

---

<div class="post-metadata">

**Author:** ![benoitdinocourt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/87869e/32.png) [@benoitdinocourt](https://www.ruby-forum.com/u/benoitdinocourt)\
**Post date:** [October 29, 2009, 8:23pm UTC](https://www.ruby-forum.com/t/why-1-4-inject-works/178146/6 "2009-10-29T20:23:17Z")

</div>

Benoit D. wrote:

> Hi rubyists,
> 
> I was just wondering why,
> 
> (1..4).inject(&:+) #=\> 10
> 
> works ? (in Ruby 1.9.2)

Works in 1.8.7 too, FWIW.

---

<div class="post-metadata">

**Author:** ![benoitdinocourt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/87869e/32.png) [@benoitdinocourt](https://www.ruby-forum.com/u/benoitdinocourt)\
**Post date:** [October 29, 2009, 8:53pm UTC](https://www.ruby-forum.com/t/why-1-4-inject-works/178146/7 "2009-10-29T20:53:51Z")

</div>

Benoit D. wrote:

> “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) ?

a + b is syntactic sugar for a.+(b), or a.send(:+,b) - you can see that  
you have one receiver, and one argument.

If you google “symbol to\_proc” you’ll find some 1.8 implementations. The  
first hit I get is PragDave’s blog where he shows this code:

class Symbol  
def to\_proc  
proc { |obj, \*args| obj.send(self, \*args) }  
end  
end

> Well, that’s strange: arity = -1, so normally only optional arguments. And  
> it expects 1 argument but want 2 ?

You can see why that is from the implementation above. The method call  
must have a receiver (obj), but we know how many other arguments to  
take, so it accepts zero or more. It passes them all as arguments to the  
method, whose name is the symbol itself.

---

<div class="post-metadata">

**Author:** ![benoitdinocourt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/87869e/32.png) [@benoitdinocourt](https://www.ruby-forum.com/u/benoitdinocourt)\
**Post date:** [October 30, 2009, 1:48am UTC](https://www.ruby-forum.com/t/why-1-4-inject-works/178146/8 "2009-10-30T01:48:55Z")

</div>

On Thu, Oct 29, 2009 at 2:14 PM, Benoit D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> (1..4).inject { |s, e| s + e } #=\> 10  
> irb\> p = a(&:+)  
> …  
> 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 `’  
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 `’

–  
Rick DeNatale

Blog: [http://talklikeaduck.denhaven2.com/](http://talklikeaduck.denhaven2.com/)  
Twitter: [http://twitter.com/RickDeNatale](http://twitter.com/RickDeNatale)  
WWR: [NameBright - Coming Soon](http://www.workingwithrails.com/person/9021-rick-denatale)  
LinkedIn: [http://www.linkedin.com/in/rickdenatale](http://www.linkedin.com/in/rickdenatale)

---

<div class="post-metadata">

**Author:** ![benoitdinocourt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/87869e/32.png) [@benoitdinocourt](https://www.ruby-forum.com/u/benoitdinocourt)\
**Post date:** [October 30, 2009, 9:24am UTC](https://www.ruby-forum.com/t/why-1-4-inject-works/178146/9 "2009-10-30T09:24:53Z")

</div>

> > call it very intensively and its quite a hotspot. I’m using ruby  
> > 1.8.7.
> 
> I can suggest you not thread hijack anymore. It is rude and messes up  
> people who use real mail clients. Start a new mail.

Was not being rude - was not aware of it. My mail client allows me to  
read and write text to people so its about as real as I need it to be.

---

<div class="post-metadata">

**Author:** ![benoitdinocourt](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/87869e/32.png) [@benoitdinocourt](https://www.ruby-forum.com/u/benoitdinocourt)\
**Post date:** [October 30, 2009, 12:29pm UTC](https://www.ruby-forum.com/t/why-1-4-inject-works/178146/10 "2009-10-30T12:29:49Z")

</div>

In fact, I knew about about the 1.8 implementations. I just forgot about  
it.  
Thank to have cleared my ideas.

The current implementation looks like (of course it must be in C):

class Symbol  
def to\_proc  
@to\_proc ||= Proc.new { |\*args| args.shift.send(self, \*args) }  
end  
end

2009/10/30 Rick DeNatale [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)
