ruby-changes:4508
From: ko1@a...
Date: Mon, 14 Apr 2008 14:02:01 +0900 (JST)
Subject: [ruby-changes:4508] knu - Ruby:r16001 (ruby_1_8): * string.c (rb_str_each_char): New methods: String#chars and
knu 2008-04-14 14:01:30 +0900 (Mon, 14 Apr 2008) New Revision: 16001 Modified files: branches/ruby_1_8/ChangeLog branches/ruby_1_8/NEWS branches/ruby_1_8/string.c Log: * string.c (rb_str_each_char): New methods: String#chars and #each_char. http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=16001&r2=16000&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/NEWS?r1=16001&r2=16000&diff_format=u http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/string.c?r1=16001&r2=16000&diff_format=u Index: ruby_1_8/NEWS =================================================================== --- ruby_1_8/NEWS (revision 16000) +++ ruby_1_8/NEWS (revision 16001) @@ -75,6 +75,8 @@ * Regexp.union accepts an array of patterns. + * String#chars + * String#each_char * String#partition * String#rpartition * String#start_with? @@ -83,6 +85,12 @@ New methods. These are $KCODE aware unlike #index, #rindex and #include?. + * String#each_byte + * String#each + * String#each_lines + + Return an enumerator if no block is given. + * StopIteration New exception class that causes Kernel#loop to stop iteration when Index: ruby_1_8/ChangeLog =================================================================== --- ruby_1_8/ChangeLog (revision 16000) +++ ruby_1_8/ChangeLog (revision 16001) @@ -1,3 +1,8 @@ +Mon Apr 14 13:58:32 2008 Akinori MUSHA <knu@i...> + + * string.c (rb_str_each_char): New methods: String#chars and + #each_char. + Mon Apr 14 13:42:20 2008 Akinori MUSHA <knu@i...> * string.c (rb_str_each_line, rb_str_each_byte): Reflect Index: ruby_1_8/string.c =================================================================== --- ruby_1_8/string.c (revision 16000) +++ ruby_1_8/string.c (revision 16001) @@ -3813,7 +3813,51 @@ /* + * Document-method: chars * call-seq: + * str.chars => anEnumerator + * str.chars {|substr| block } => str + * + * Returns an enumerator that gives each character in the string. + * If a block is given, it iterates over each character in the string. + * + * "foo".chars.to_a #=> ["f","o","o"] + */ + +/* + * Document-method: each_char + * call-seq: + * str.each_char {|cstr| block } => str + * + * Passes each character in <i>str</i> to the given block. + * + * "hello".each_char {|c| print c, ' ' } + * + * <em>produces:</em> + * + * h e l l o + */ + +static VALUE +rb_str_each_char(VALUE str) +{ + int i, len, n; + const char *ptr; + + RETURN_ENUMERATOR(str, 0, 0); + str = rb_str_new4(str); + ptr = RSTRING(str)->ptr; + len = RSTRING(str)->len; + for (i = 0; i < len; i += n) { + n = mbclen(ptr[i]); + rb_yield(rb_str_substr(str, i, n)); + } + return str; +} + + +/* + * call-seq: * str.chop! => str or nil * * Processes <i>str</i> as for <code>String#chop</code>, returning <i>str</i>, @@ -4950,9 +4994,11 @@ rb_define_method(rb_cString, "each_line", rb_str_each_line, -1); rb_define_method(rb_cString, "each", rb_str_each_line, -1); rb_define_method(rb_cString, "each_byte", rb_str_each_byte, 0); + rb_define_method(rb_cString, "each_char", rb_str_each_char, 0); rb_define_method(rb_cString, "lines", rb_str_each_line, -1); rb_define_method(rb_cString, "bytes", rb_str_each_byte, 0); + rb_define_method(rb_cString, "chars", rb_str_each_char, 0); rb_define_method(rb_cString, "sum", rb_str_sum, -1); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/