diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-04-19 17:26:01 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-04-19 17:33:00 +0900 |
| commit | 8b92ab5c7bfbc52934fe23075a86163f2b9fc7c3 (patch) | |
| tree | d320a3a619155000703c321af9300715146dad84 /mrbgems | |
| parent | c79e81ebc32274be7442b46541872ed343c6f752 (diff) | |
| download | mruby-8b92ab5c7bfbc52934fe23075a86163f2b9fc7c3.tar.gz mruby-8b92ab5c7bfbc52934fe23075a86163f2b9fc7c3.zip | |
CRuby2.6 stops deprecating `String#lines` with a block.
`String#lines` (with a block) is now implemented in Ruby.
Diffstat (limited to 'mrbgems')
| -rw-r--r-- | mrbgems/mruby-string-ext/mrblib/string.rb | 21 | ||||
| -rw-r--r-- | mrbgems/mruby-string-ext/src/string.c | 61 |
2 files changed, 47 insertions, 35 deletions
diff --git a/mrbgems/mruby-string-ext/mrblib/string.rb b/mrbgems/mruby-string-ext/mrblib/string.rb index 0da84daed..39ee57419 100644 --- a/mrbgems/mruby-string-ext/mrblib/string.rb +++ b/mrbgems/mruby-string-ext/mrblib/string.rb @@ -365,4 +365,25 @@ class String self[0, 0] = arg self end + + ## + # call-seq: + # string.lines -> array of string + # string.lines {|s| block} -> array of string + # + # Returns strings per line; + # + # a = "abc\ndef" + # a.lines #=> ["abc\n", "def"] + # + # If a block is given, it works the same as <code>each_line</code>. + def lines(&blk) + lines = self.__lines + if blk + lines.each do |line| + blk.call(line) + end + end + lines + end end diff --git a/mrbgems/mruby-string-ext/src/string.c b/mrbgems/mruby-string-ext/src/string.c index 416f98f8b..48fa27085 100644 --- a/mrbgems/mruby-string-ext/src/string.c +++ b/mrbgems/mruby-string-ext/src/string.c @@ -309,40 +309,6 @@ mrb_fixnum_chr(mrb_state *mrb, mrb_value num) /* * call-seq: - * string.lines -> array of string - * - * Returns strings per line; - * - * a = "abc\ndef" - * a.lines #=> ["abc\n", "def"] - */ -static mrb_value -mrb_str_lines(mrb_state *mrb, mrb_value self) -{ - mrb_value result; - int ai; - mrb_int len; - char *b = RSTRING_PTR(self); - char *p = b, *t; - char *e = b + RSTRING_LEN(self); - - mrb_get_args(mrb, ""); - - result = mrb_ary_new(mrb); - ai = mrb_gc_arena_save(mrb); - while (p < e) { - t = p; - while (p < e && *p != '\n') p++; - if (*p == '\n') p++; - len = (mrb_int) (p - t); - mrb_ary_push(mrb, result, mrb_str_new(mrb, t, len)); - mrb_gc_arena_restore(mrb, ai); - } - return result; -} - -/* - * call-seq: * string.succ -> string * * Returns next sequence of the string; @@ -745,6 +711,31 @@ mrb_str_del_suffix(mrb_state *mrb, mrb_value self) return mrb_str_substr(mrb, self, 0, slen-plen); } +static mrb_value +mrb_str_lines(mrb_state *mrb, mrb_value self) +{ + mrb_value result; + int ai; + mrb_int len; + char *b = RSTRING_PTR(self); + char *p = b, *t; + char *e = b + RSTRING_LEN(self); + + mrb_get_args(mrb, ""); + + result = mrb_ary_new(mrb); + ai = mrb_gc_arena_save(mrb); + while (p < e) { + t = p; + while (p < e && *p != '\n') p++; + if (*p == '\n') p++; + len = (mrb_int) (p - t); + mrb_ary_push(mrb, result, mrb_str_new(mrb, t, len)); + mrb_gc_arena_restore(mrb, ai); + } + return result; +} + void mrb_mruby_string_ext_gem_init(mrb_state* mrb) { @@ -763,7 +754,6 @@ mrb_mruby_string_ext_gem_init(mrb_state* mrb) mrb_define_method(mrb, s, "hex", mrb_str_hex, MRB_ARGS_NONE()); mrb_define_method(mrb, s, "oct", mrb_str_oct, MRB_ARGS_NONE()); mrb_define_method(mrb, s, "chr", mrb_str_chr, MRB_ARGS_NONE()); - mrb_define_method(mrb, s, "lines", mrb_str_lines, MRB_ARGS_NONE()); mrb_define_method(mrb, s, "succ", mrb_str_succ, MRB_ARGS_NONE()); mrb_define_method(mrb, s, "succ!", mrb_str_succ_bang, MRB_ARGS_NONE()); mrb_alias_method(mrb, s, mrb_intern_lit(mrb, "next"), mrb_intern_lit(mrb, "succ")); @@ -775,6 +765,7 @@ mrb_mruby_string_ext_gem_init(mrb_state* mrb) mrb_define_method(mrb, s, "delete_suffix!", mrb_str_del_suffix_bang, MRB_ARGS_REQ(1)); mrb_define_method(mrb, s, "delete_suffix", mrb_str_del_suffix, MRB_ARGS_REQ(1)); + mrb_define_method(mrb, s, "__lines", mrb_str_lines, MRB_ARGS_NONE()); mrb_define_method(mrb, mrb->fixnum_class, "chr", mrb_fixnum_chr, MRB_ARGS_NONE()); } |
