diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c index ca71bb48..9a863b6b 100644 --- a/ext/stringio/stringio.c +++ b/ext/stringio/stringio.c @@ -1428,15 +1428,177 @@ strio_readline(int argc, VALUE *argv, VALUE self) } /* + * :markup: markdown + * * call-seq: * each_line(sep = $/, chomp: false) {|line| ... } -> self * each_line(limit, chomp: false) {|line| ... } -> self * each_line(sep, limit, chomp: false) {|line| ... } -> self * - * Calls the block with each remaining line read from the stream; - * does nothing if already at end-of-file; - * returns +self+. - * See {Line IO}[rdoc-ref:IO@Line+IO]. + * With a block given calls the block with each remaining line (see "Position" below) in the stream; + * returns `self`. + * + * Leaves stream position as end-of-stream. + * + * **No Arguments** + * + * With no arguments given, + * reads lines using the default record separator global variable `$/`, whose initial value is `"\n"`. + * + * ``` + * 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: + * + * ``` + * 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 global variable `$/`, whose initial value is `"\n"`; + * also limits the size (in characters) of each line to the given limit: + * + * ``` + * 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: + * + * ``` + * 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): + * + * ``` + * 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" + * ``` + * + * **Special Record Separators** + * + * Like some methds 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]. + * + * ``` + * 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" + * ``` + * + * ``` + * 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: + * + * ``` + * 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. */ static VALUE strio_each(int argc, VALUE *argv, VALUE self) @@ -1935,15 +2097,34 @@ strio_set_encoding_by_bom(VALUE self) } /* + * :markup: markdown + * * \IO streams for strings, with access similar to * {IO}[rdoc-ref:IO]; * see {IO}[rdoc-ref:IO]. * - * === About the Examples + * ### About the Examples * * Examples on this page assume that \StringIO has been required: * - * require 'stringio' + * ``` + * require 'stringio' + * ``` + * + * And that these constants have been defined: + * + * ``` + * TEXT = <