# Recursive line counter (review?)

**URL:** <https://www.ruby-forum.com/t/recursive-line-counter-review/80375>\
**Category:** Ruby\
**Created:** [March 13, 2006, 3:36pm UTC](https://www.ruby-forum.com/t/recursive-line-counter-review/80375 "2006-03-13T15:36:08Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Thibaut\_BarrSSSSre](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/6de8d8/32.png) [@Thibaut\_BarrSSSSre](https://www.ruby-forum.com/u/Thibaut_BarrSSSSre)\
**Post date:** [March 13, 2006, 3:36pm UTC](https://www.ruby-forum.com/t/recursive-line-counter-review/80375/1 "2006-03-13T15:36:08Z")

</div>

Hi

I’m practicing ruby everyday on small tools to learn more, could anyone  
review what I’ve coded today ? This is a basic line of code counter  
(pure ruby), any feedback welcome!

thanks !

Thibaut

def loc\_file(file)  
File.open(file).inject(0) { |loc,line| loc+1 }  
end

def loc\_by\_extension(root,ext)  
Dir[root+ext].inject(0) { |total,f| total + loc\_file(f) }  
end

["_.cs","_.cpp","_.h","_.resx"].each do |ext|  
puts “#{loc\_by\_extension(‘c:/evolutionsyncfusion/\*\*/’,ext)} loc for  
#{ext}”  
end

---

<div class="post-metadata">

**Author:** ![Thibaut\_BarrSSSSre](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/6de8d8/32.png) [@Thibaut\_BarrSSSSre](https://www.ruby-forum.com/u/Thibaut_BarrSSSSre)\
**Post date:** [March 13, 2006, 4:55pm UTC](https://www.ruby-forum.com/t/recursive-line-counter-review/80375/2 "2006-03-13T16:55:50Z")

</div>

I like your use of inject. However, the code you show is not  
recursive, but thats not really important unless it being recursive was  
the point…

When I was playing with a similar bit of code I recall using  
`
IO.readlines(‘filename’).size
`

I also recall trying  
`
f=File.open(‘filename’)
f.seek(0,IO::SEEKEND)
lc = f.lineno
`

If speed is an issue oyu might want to compare various methods.

Happy coding

Cheers

---

<div class="post-metadata">

**Author:** ![Thibaut\_BarrSSSSre](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/6de8d8/32.png) [@Thibaut\_BarrSSSSre](https://www.ruby-forum.com/u/Thibaut_BarrSSSSre)\
**Post date:** [March 13, 2006, 5:42pm UTC](https://www.ruby-forum.com/t/recursive-line-counter-review/80375/3 "2006-03-13T17:42:28Z")

</div>

ChrisH wrote:

> I like your use of inject. However, the code you show is not  
> recursive, but thats not really important unless it being recursive  
> was the point…
> 
> When I was playing with a similar bit of code I recall using  
> `
> IO.readlines(‘filename’).size
> `

This doesn’t work well with large files and also uses more resources  
(memory).

> I also recall trying  
> `
> f=File.open(‘filename’)
> f.seek(0,IO::SEEKEND)
> lc = f.lineno
> `

Does this really work? I can’t believe it because during seeking the  
file  
is actually not read - so the IO instance cannot really count line  
numbers, can it?

> If speed is an issue oyu might want to compare various methods.

Yeah.

Kind regards

```
robert
```

---

<div class="post-metadata">

**Author:** ![Thibaut\_BarrSSSSre](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/6de8d8/32.png) [@Thibaut\_BarrSSSSre](https://www.ruby-forum.com/u/Thibaut_BarrSSSSre)\
**Post date:** [March 13, 2006, 5:42pm UTC](https://www.ruby-forum.com/t/recursive-line-counter-review/80375/4 "2006-03-13T17:42:29Z")

</div>

Thibaut Barrère wrote:

> def loc\_file(file)  
> File.open(file).inject(0) { |loc,line| loc+1 }  
> end

You’re not properly closing IO’s. Rather do

def loc\_file(file)  
File.open(file) {|io| io.inject(0) { |loc,line| loc+1 } }  
end

Kind regards

```
robert
```
