[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]