# Remove the error

**URL:** <https://www.ruby-forum.com/t/remove-the-error/192664>\
**Category:** Ruby\
**Created:** [August 3, 2010, 8:07pm UTC](https://www.ruby-forum.com/t/remove-the-error/192664 "2010-08-03T20:07:29Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![amiref](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/41988e/32.png) [@amiref](https://www.ruby-forum.com/u/amiref)\
**Post date:** [August 3, 2010, 8:07pm UTC](https://www.ruby-forum.com/t/remove-the-error/192664/1 "2010-08-03T20:07:29Z")

</div>

Hi  
Why these codes result error ?

1-  
array = [\*1…10]  
sum = array.inject { |memo,item| memo+item if item !=3 }

2-  
array = [\*1…10]  
sum = array.inject { |memo,item| puts memo+item }

---

<div class="post-metadata">

**Author:** ![amiref](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/41988e/32.png) [@amiref](https://www.ruby-forum.com/u/amiref)\
**Post date:** [August 3, 2010, 8:36pm UTC](https://www.ruby-forum.com/t/remove-the-error/192664/2 "2010-08-03T20:36:04Z")

</div>

On Tue, Aug 3, 2010 at 2:07 PM, Amir E. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> Why these codes result error ?
> 
> 2-  
> array = [\*1…10]  
> sum = array.inject { |memo,item| puts memo+item }

irb(main):001:0\> array = [\*1…10]  
=\> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  
irb(main):002:0\> sum = array.inject { |memo,item| puts memo+item }  
3  
NoMethodError: undefined method `+' for nil:NilClass from (irb):2 from (irb):2:in `inject’  
from (irb):2:in `each' from (irb):2:in `inject’  
from (irb):2  
from :0

The method ‘puts’ always returns ‘nil’:

irb(main):003:0\> sum = array.inject { |memo,item| puts  
“#{memo}\t#{item}” }  
1 2  
3  
4  
5  
6  
7  
8  
9  
10  
=\> nil

irb(main):004:0\> sum = array.inject { |memo,item| puts  
“#{memo}\t#{item}\t#{memo + item}” }  
1 2 3  
NoMethodError: undefined method `+' for nil:NilClass from (irb):4 from (irb):4:in `inject’  
from (irb):4:in `each' from (irb):4:in `inject’  
from (irb):4  
from :0

---

<div class="post-metadata">

**Author:** ![amiref](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/41988e/32.png) [@amiref](https://www.ruby-forum.com/u/amiref)\
**Post date:** [August 4, 2010, 10:12am UTC](https://www.ruby-forum.com/t/remove-the-error/192664/3 "2010-08-04T10:12:50Z")

</div>

Amir E. wrote:

> Hi  
> Why these codes result error ?
> 
> 1-  
> array = [\*1…10]  
> sum = array.inject { |memo,item| memo+item if item !=3 }

sum = array.inject(0) { |memo,item| item != 3 ? memo+item : memo }

Note a subtlety here: if you omit the (0) argument then the initial memo  
is always set to the first item, so you wouldn’t be able to skip it.

> > array.inject { |memo,item| item != 1 ? memo+item : memo }  
> > =\> 55
> 
> > array.inject(0) { |memo,item| item != 1 ? memo+item : memo }  
> > =\> 54

> 2-  
> array = [\*1…10]  
> sum = array.inject { |memo,item| puts memo+item }

sum = array.inject { |memo,item| puts memo,item; memo+item }

In both cases, you need to ensure that the last expression evaluated by  
the block is the value you want for the ‘memo’ in the next iteration.

---

<div class="post-metadata">

**Author:** ![amiref](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/41988e/32.png) [@amiref](https://www.ruby-forum.com/u/amiref)\
**Post date:** [August 4, 2010, 12:23pm UTC](https://www.ruby-forum.com/t/remove-the-error/192664/4 "2010-08-04T12:23:53Z")

</div>

Avoid expressions returning tre/false as if or nil as puts.  
Two possible solutions:  
1-  
sum = array.inject(0) do |memo,item|  
item == 3 ? (memo) : (memo + item)  
end  
puts “Sum = #{sum}”

2-  
sum=0  
puts “item sum”  
array.each { |item| item == 3 ? (sum):(sum += item); printf “%4d  
%6d\n”,item,sum }  
puts “Sum = #{sum}”

HTH gfb

“Amir E.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote in message  
news:removed\_email\_address@domain.invalid…
