Project

General

Profile

Actions

Bug #7440

closed

IO#lines etc. should return Array

Added by yhara (Yutaka HARA) over 11 years ago. Updated over 11 years ago.

Status:
Rejected
Target version:
ruby -v:
ruby 2.0.0dev (2012-11-26 trunk 36708) [x86_64-darwin12.2.1]
Backport:
[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.


Related issues 1 (0 open1 closed)

Related to Ruby master - Feature #6670: str.chars.last should be possibleClosedmame (Yusuke Endoh)Actions

Updated by headius (Charles Nutter) over 11 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 11 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 11 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 11 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 11 years ago

  • Status changed from Open to Rejected

This issue is now included in #6670.

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0