Bug #7440
closed
IO#lines etc. should return Array
Added by yhara (Yutaka HARA) about 12 years ago.
Updated about 12 years ago.
ruby -v:
ruby 2.0.0dev (2012-11-26 trunk 36708) [x86_64-darwin12.2.1]
[ruby-core:<unknown>]
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.
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
With the exception of StringIO hey also support infinite streams. I think the current Enumerator is best.
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 }
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...
- Status changed from Open to Rejected
This issue is now included in #6670.
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0