Bug #7440
closedIO#lines etc. should return Array
Description
String#bytes, #chars, #codepints and #lines are changed to return Array in #6670.
For consistent behavior, following methods should return Array too:
- ARGF.lines, chars, bytes, codepoints
- IO#lines, chars, bytes, codepoints
- StringIO#lines, chars, bytes, codepoints
- Zlib::GzipReader#lines, bytes
Please let me know if there are more.
Updated by headius (Charles Nutter) over 9 years ago
Is this really wnat you'd want? ARGF and IO (and possibly Zlib's readers) can stream data lazily in lines/chars/bytes/codepoints, where forcing them to an Array would have to eagerly read everything (and potentially block).
irb(main):001:0> io = File.open('Makefile')
=> #File:Makefile
irb(main):002:0> lines = io.lines
=> #<Enumerator: #File:Makefile:lines>
irb(main):003:0> lines.next
=> "SHELL = /bin/sh\n"
irb(main):004:0> io.pos
=> 16
irb(main):005:0> lines.next
=> "NULLCMD = :\n"
irb(main):006:0> io.pos
=> 28
irb(main):007:0> lines.to_a; nil
=> nil
irb(main):008:0> io.pos
=> 12737
Updated by drbrain (Eric Hodel) over 9 years ago
With the exception of StringIO hey also support infinite streams. I think the current Enumerator is best.
Updated by Eregon (Benoit Daloze) over 9 years ago
drbrain (Eric Hodel) wrote:
With the exception of StringIO hey also support infinite streams. I think the current Enumerator is best.
Strongly agreed. It could also increase a lot the memory usage (while on String we anyway already have the whole String in memory so it is less of a concern).
File.open('/usr/share/dict/words').lines.each_with_object(Hash.new(0)) { |word, count| count[word[0].downcase] += 1 }
Updated by yhara (Yutaka HARA) over 9 years ago
Eregon (Benoit Daloze) wrote:
Strongly agreed. It could also increase a lot the memory usage (while on String we anyway already have the whole String in memory so it is less of a concern).
File.open('/usr/share/dict/words').lines.each_with_object(Hash.new(0)) { |word, count| count[word[0].downcase] += 1 }
In that case you can use IO#each_line, which still returns Enumerator.
File.open('/usr/share/dict/words').each_line.with_object(Hash.new(0)) { |word, count| count[word[0].downcase] += 1 }
But in other words, we need to replace uses of IO#lines to IO#each_line, or our existing Ruby program may have performance problem with 2.0.0...
Ticket #6670 is reopened. Please continue discussion there http://bugs.ruby-lang.org/issues/6670
Updated by yhara (Yutaka HARA) over 9 years ago
- Status changed from Open to Rejected
This issue is now included in #6670.