Bug #18770
closedInconsistent behavior of IO/StringIO's each methods when called with nil as a separator, limit and chomp: true
Description
IO's and StringIO's #each
method (and similar ones - #gets
, #readline
etc) behave in a different way in the following case:
- separator is
nil
- limit is passed
-
chomp: true
passed
In this case StringIO#each
removes trailing \n
but IO#each
does not:
StringIO.new("abc\n\ndef\n").each(nil, 2, chomp: true).to_a
#=> ["ab", "c", "\nd", "ef", ""]
File.open('chomp.txt').each(nil, 2, chomp: true).to_a
#=> ["ab", "c\n", "\nd", "ef", "\n"]
The file has the same content:
File.read('chomp.txt');
#=> "abc\n\ndef\n"
Expected behavior - both methods return the same result.
Updated by jeremyevans0 (Jeremy Evans) about 2 years ago
- Related to Bug #18768: Inconsistent behavior of IO, StringIO and String each_line methods when return paragraph and chomp: true passed added
Updated by jeremyevans0 (Jeremy Evans) about 2 years ago
I think both IO#each and StringIO#each behavior is wrong when combining nil
with chomp
. My opinion is that a nil
separator means there is no separator at all, and therefore chomp
should either raise an error or be ignored if nil
is the separator. Assuming that ignoring chomp
is desired behavior for nil
separator, it follows:
-
IO#each behavior for
nil
andchomp
with a limit is correct. However, IO#each fornil
andchomp
without a limit is not, since it removes a final line separator. -
StringIO#each behavior for
nil
andchomp
is wrong, regardless of whether a limit is used.
This issue is related to String#each_line, but the nil
and chomp
combination there is handled correctly, not removing any characters (it doesn't support limit).
Note that Ruby has current tests for the IO#each behavior for nil
and chomp
without limit removing the trailing line separator. So the current behavior for that is definitely expected, though I consider it undesirable.
I've added PRs for Ruby (https://github.com/ruby/ruby/pull/5959) and StringIO (https://github.com/ruby/stringio/pull/28) for this.
Updated by jeremyevans (Jeremy Evans) about 2 years ago
- Status changed from Open to Closed
Applied in changeset git|adaaf12857ce41d35b282e3fb5aa330934ce45c6.
[ruby/stringio] Ignore chomp keyword for nil separator
nil separator means no separator at all, so nothing should be
chomped.
Partial fix for Ruby [Bug #18770]
Updated by jeremyevans0 (Jeremy Evans) about 2 years ago
- Status changed from Closed to Open
Updated by mame (Yusuke Endoh) about 2 years ago
We discussed this at the dev meeting, and @matz (Yukihiro Matsumoto) agreed with @jeremyevans0 (Jeremy Evans).
Updated by jeremyevans (Jeremy Evans) about 2 years ago
- Status changed from Open to Closed
Applied in changeset git|04f86ad0b5d2fe4711ff300d855228a6aed55f33.
Do not chomp trailing line separator IO#each with nil separator and chomp
nil separator means no sepator, so chomp should not remove a line
separator.
Partially Fixes [Bug #18770]
Updated by jeremyevans0 (Jeremy Evans) about 2 years ago
- Status changed from Closed to Open
Updated by jeremyevans (Jeremy Evans) about 2 years ago
- Status changed from Open to Closed
Applied in changeset git|7223c0da152114c84e1c4261a282faaea21646fb.
Do not chomp trailing line separator IO#each with nil separator and chomp
nil separator means no sepator, so chomp should not remove a line
separator.
Partially Fixes [Bug #18770]