# Array Number of Leaves

**URL:** <https://www.ruby-forum.com/t/array-number-of-leaves/177896>\
**Category:** Ruby\
**Created:** [October 26, 2009, 1:04pm UTC](https://www.ruby-forum.com/t/array-number-of-leaves/177896 "2009-10-26T13:04:34Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [October 26, 2009, 1:04pm UTC](https://www.ruby-forum.com/t/array-number-of-leaves/177896/1 "2009-10-26T13:04:34Z")

</div>

Dear Rubyist,

I want to count array list [1,2,3,[4],5] —\> # 5 leaves  
but I always get sum\_of\_array.

Where did I do wrong?

def array\_leave1 # sum\_of\_array?  
res = 0  
self.each{|elem|  
if elem.kind\_of?(Array)  
res += elem.sum\_of\_array  
else  
res += elem  
end  
}  
return res  
end

def number\_of\_leaves  
self.inject(0){|acc,x|  
if x.kind\_of?(Array)  
acc += x.number\_of\_leaves  
else  
acc += x  
end  
}  
end

many thanks in advance.

regards,  
salai

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [October 26, 2009, 1:18pm UTC](https://www.ruby-forum.com/t/array-number-of-leaves/177896/2 "2009-10-26T13:18:02Z")

</div>

2009/10/26 salai [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> Dear Rubyist,
> 
> I want to count array list [1,2,3,[4],5] —\> # 5 leaves  
> but I always get sum\_of\_array.
> 
> Where did I do wrong?
> 
> ```
> def array_leave1 # sum_of_array?
> 
> ```

The method should have the same name as the one you call below  
(“elem.sum\_of\_array”).

> def number\_of\_leaves  
> self.inject(0){|acc,x|  
> if x.kind\_of?(Array)  
> acc += x.number\_of\_leaves  
> else  
> acc += x

The line above should read acc += 1. You could even simplify that as

acc += (x.number\_of\_leaves rescue 1)

> ```
> end
> }
> 
> ```
> 
> end

Not sure what your issue is exactly. Please show the complete code  
along with expected results. The code you presented cannot be the  
real code because at least the class declaration is missing.

Cheers

robert

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [October 26, 2009, 1:21pm UTC](https://www.ruby-forum.com/t/array-number-of-leaves/177896/3 "2009-10-26T13:21:33Z")

</div>

Robert K. wrote:

> 2009/10/26 salai [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):
> 
> > Dear Rubyist,
> > 
> > I want to count array list [1,2,3,[4],5] —\> # 5 leaves

Out of sheer curiosity… [1,2,3,[4],5].size # → 5  
Not what you need?

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [October 26, 2009, 1:41pm UTC](https://www.ruby-forum.com/t/array-number-of-leaves/177896/4 "2009-10-26T13:41:27Z")

</div>

Hi,

Am Montag, 26. Okt 2009, 21:17:17 +0900 schrieb Robert K.:

> > ```
> > end
> > }
> > 
> > ```

I prefer doing it with `case’. I admit I did no performance check.

inject( 0) { |acc,x|  
acc += case x  
when Array then x.number\_of\_leaves  
else 1  
end  
}

Bertram

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [October 26, 2009, 1:26pm UTC](https://www.ruby-forum.com/t/array-number-of-leaves/177896/5 "2009-10-26T13:26:49Z")

</div>

Thankyou verymuch.

regards,  
salai.

puts [1,2,3,[4,99],5,7].number\_of\_leaves #–\> 7

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [October 26, 2009, 1:42pm UTC](https://www.ruby-forum.com/t/array-number-of-leaves/177896/6 "2009-10-26T13:42:02Z")

</div>

On Mon, Oct 26, 2009 at 1:26 PM, salai [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> puts [1,2,3,[4,99],5,7].number\_of\_leaves #–\> 7

irb(main):001:0\> [1,2,3,[4,5,6],7].flatten.size  
=\> 7

Jesus.

---

<div class="post-metadata">

**Author:** ![koko](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/ee59a6/32.png) [@koko](https://www.ruby-forum.com/u/koko)\
**Post date:** [October 26, 2009, 3:09pm UTC](https://www.ruby-forum.com/t/array-number-of-leaves/177896/7 "2009-10-26T15:09:16Z")

</div>

2009/10/26 Bertram S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > The line above should read acc += 1. You could even simplify that as  
> > when Array then x.number\_of\_leaves  
> > else 1  
> > end  
> > }

You’re right, the solution with “rescue” is rather hackish. 🙂

My serious solution would be

acc += Array === x ? x.number\_of\_leaves : 1

I prefer to use case for cases (sic!) which have more than two  
alternatives.

Kind regards

robert
