Can you implement a better IO#each_lines?

like this,thanks
#!/usr/bin/env ruby
class IO
def each_lines(n)
run=true
while run
lines=[]
n.times{
ln = self.gets
unless ln
run=false
break
else
lines<<ln.chomp
end
}
yield lines unless lines.empty?
end
end
end

open(FILE) do |f|
f.each_lines(3) do |lines|
p lines
end
end

Hi –

On Sat, 24 Oct 2009, Haoqi H. wrote:

     run=false

open(FILE) do |f|
f.each_lines(3) do |lines|
p lines
end
end

require ‘enumerator’ # if necessary
open(FILE) do |f|
f.each_slice(3) do |lines|
p lines
end
end

:slight_smile:

David


The Ruby training with D. Black, G. Brown, J.McAnally
Compleat Jan 22-23, 2010, Tampa, FL
Rubyist http://www.thecompleatrubyist.com

David A. Black/Ruby Power and Light, LLC (http://www.rubypal.com)

On 10/24/2009 01:24 PM, Haoqi H. wrote:

      run=false

open(FILE) do |f|
f.each_lines(3) do |lines|
p lines
end
end

There is no need to implement anything. You can use #each_slice:

robert@fussel:~$ seq 1 10 | ruby1.9 -e ‘$stdin.each_slice(3) {|l| p l}’
[“1\n”, “2\n”, “3\n”]
[“4\n”, “5\n”, “6\n”]
[“7\n”, “8\n”, “9\n”]
[“10\n”]
robert@fussel:~$

This works in 1.8.7 and 1.9.*.

Kind regards

robert

great~thank you!

On Sat, 24 Oct 2009, Robert K. wrote:

     unless ln

[“4\n”, “5\n”, “6\n”]
[“7\n”, “8\n”, “9\n”]
[“10\n”]
robert@fussel:~$

This works in 1.8.7 and 1.9.*.

And 1.8.6 if you require ‘enumerator’.

David


The Ruby training with D. Black, G. Brown, J.McAnally
Compleat Jan 22-23, 2010, Tampa, FL
Rubyist http://www.thecompleatrubyist.com

David A. Black/Ruby Power and Light, LLC (http://www.rubypal.com)