mirror of
https://github.com/ruby/ruby.git
synced 2026-10-28 16:36:20 +08:00
(https://github.com/ruby/stringio/pull/165) Adds to "Position": pos inside a character. Makes a couple of minor corrections. --------- https://github.com/ruby/stringio/commit/ff332abafa Co-authored-by: Sutou Kouhei <kou@cozmixng.org>
190 lines
3.4 KiB
Markdown
190 lines
3.4 KiB
Markdown
With a block given calls the block with each remaining line (see "Position" below) in the stream;
|
|
returns `self`.
|
|
|
|
Leaves stream position at end-of-stream.
|
|
|
|
**No Arguments**
|
|
|
|
With no arguments given,
|
|
reads lines using the default record separator
|
|
(global variable `$/`, whose initial value is `"\n"`).
|
|
|
|
```ruby
|
|
strio = StringIO.new(TEXT)
|
|
strio.each_line {|line| p line }
|
|
strio.eof? # => true
|
|
```
|
|
|
|
Output:
|
|
|
|
```
|
|
"First line\n"
|
|
"Second line\n"
|
|
"\n"
|
|
"Fourth line\n"
|
|
"Fifth line\n"
|
|
```
|
|
|
|
**Argument `sep`**
|
|
|
|
With only string argument `sep` given,
|
|
reads lines using that string as the record separator:
|
|
|
|
```ruby
|
|
strio = StringIO.new(TEXT)
|
|
strio.each_line(' ') {|line| p line }
|
|
```
|
|
|
|
Output:
|
|
|
|
```
|
|
"First "
|
|
"line\nSecond "
|
|
"line\n\nFourth "
|
|
"line\nFifth "
|
|
"line\n"
|
|
```
|
|
|
|
**Argument `limit`**
|
|
|
|
With only integer argument `limit` given,
|
|
reads lines using the default record separator;
|
|
also limits the size (in characters) of each line to the given limit:
|
|
|
|
```ruby
|
|
strio = StringIO.new(TEXT)
|
|
strio.each_line(10) {|line| p line }
|
|
```
|
|
|
|
Output:
|
|
|
|
```
|
|
"First line"
|
|
"\n"
|
|
"Second lin"
|
|
"e\n"
|
|
"\n"
|
|
"Fourth lin"
|
|
"e\n"
|
|
"Fifth line"
|
|
"\n"
|
|
```
|
|
|
|
**Arguments `sep` and `limit`**
|
|
|
|
With arguments `sep` and `limit` both given,
|
|
honors both:
|
|
|
|
```ruby
|
|
strio = StringIO.new(TEXT)
|
|
strio.each_line(' ', 10) {|line| p line }
|
|
```
|
|
|
|
Output:
|
|
|
|
```
|
|
"First "
|
|
"line\nSecon"
|
|
"d "
|
|
"line\n\nFour"
|
|
"th "
|
|
"line\nFifth"
|
|
" "
|
|
"line\n"
|
|
```
|
|
|
|
**Position**
|
|
|
|
As stated above, method `each` _remaining_ line in the stream.
|
|
|
|
In the examples above each `strio` object starts with its position at beginning-of-stream;
|
|
but in other cases the position may be anywhere (see StringIO#pos):
|
|
|
|
```ruby
|
|
strio = StringIO.new(TEXT)
|
|
strio.pos = 30 # Set stream position to character 30.
|
|
strio.each_line {|line| p line }
|
|
```
|
|
|
|
Output:
|
|
|
|
```
|
|
" line\n"
|
|
"Fifth line\n"
|
|
```
|
|
|
|
In all the examples above, the stream position is at the beginning of a character;
|
|
in other cases, that need not be so:
|
|
|
|
```ruby
|
|
s = 'こんにちは' # Five 3-byte characters.
|
|
strio = StringIO.new(s)
|
|
strio.pos = 3 # At beginning of second character.
|
|
strio.each_line {|line| p line }
|
|
strio.pos = 4 # At second byte of second character.
|
|
strio.each_line {|line| p line }
|
|
strio.pos = 5 # At third byte of second character.
|
|
strio.each_line {|line| p line }
|
|
```
|
|
|
|
Output:
|
|
|
|
```
|
|
"んにちは"
|
|
"\x82\x93にちは"
|
|
"\x93にちは"
|
|
```
|
|
|
|
**Special Record Separators**
|
|
|
|
Like some methods in class `IO`, StringIO.each honors two special record separators;
|
|
see {Special Line Separators}[https://docs.ruby-lang.org/en/master/IO.html#class-IO-label-Special+Line+Separator+Values].
|
|
|
|
```ruby
|
|
strio = StringIO.new(TEXT)
|
|
strio.each_line('') {|line| p line } # Read as paragraphs (separated by blank lines).
|
|
```
|
|
|
|
Output:
|
|
|
|
```
|
|
"First line\nSecond line\n\n"
|
|
"Fourth line\nFifth line\n"
|
|
```
|
|
|
|
```ruby
|
|
strio = StringIO.new(TEXT)
|
|
strio.each_line(nil) {|line| p line } # "Slurp"; read it all.
|
|
```
|
|
|
|
Output:
|
|
|
|
```
|
|
"First line\nSecond line\n\nFourth line\nFifth line\n"
|
|
```
|
|
|
|
**Keyword Argument `chomp`**
|
|
|
|
With keyword argument `chomp` given as `true` (the default is `false`),
|
|
removes trailing newline (if any) from each line:
|
|
|
|
```ruby
|
|
strio = StringIO.new(TEXT)
|
|
strio.each_line(chomp: true) {|line| p line }
|
|
```
|
|
|
|
Output:
|
|
|
|
```
|
|
"First line"
|
|
"Second line"
|
|
""
|
|
"Fourth line"
|
|
"Fifth line"
|
|
```
|
|
|
|
With no block given, returns a new {Enumerator}[https://docs.ruby-lang.org/en/master/Enumerator.html].
|
|
|
|
|
|
Related: StringIO.each_byte, StringIO.each_char, StringIO.each_codepoint.
|