成瀬です。

HEADに対して、
String#each_byte #=> array
と、組み込みの
String#each_char #=> array
String#each_char{|char| block } #=> str
の提案です。

まず、String#each_byte。
現在、stringのバイト単位の配列が欲しい場合は、
string.unpack('C*')
などとしますが、unpackを使うのは直感的ではありません。

過去に、each_*がブロックなしで動作する例が他に無い[ruby-list:37048]、
とされていますが、わたし自身はscanからの連想で、
何度かeach_byteをブロック無しで使い、その度に悲しい思いをしているので、
ブロック無しだと配列を返すようになるとうれしいです。


次にString#each_char。
過去にeach_charについては議論されているようですが、
eachのaliasを置き換えることは別とした場合、
each_charを組み込みで導入すること自体への問題点は、
メソッド名だけのように見えます。

matz wrote in [ruby-dev:23995]
>  (2) M17N的な"character"ってのはコードポイント(に対応するバ
>      イト列)ですから、たとえば合成文字の場合一部分だけを表現
>      するものもcharacterになってしまいます。こういうものを堂々
>      とcharと呼んではいけないような気もします。なんか言い名
>      前ないかな。

http://www.itscj.ipsj.or.jp/tutorials/tu48.htmlにて、
「文字構成要素でも符号位置を持っていれば,
 それをcharacterと呼ぶことがSC 2の定義であり,
 これらを合成した結果の"いわゆる文字"はcombining sequenceと
 定義されている.」とされていることから、
このeach_charは挙動にふさわしい名前だと考えます。
よって、改めてeach_charの導入を提案します。

#Ruby M17Nって最近どうなってるのかな〜と思いつつ

Index: string.c
===================================================================
RCS file: /src/ruby/string.c,v
retrieving revision 1.230
diff -u -r1.230 string.c
--- string.c    4 Mar 2005 06:47:41 -0000       1.230
+++ string.c    7 Jul 2005 02:44:23 -0000
@@ -3760,6 +3760,15 @@
 {
     long i;

+    if (!rb_block_given_p()) {
+       VALUE ary = rb_ary_new();
+
+       for (i=0; i<RSTRING(str)->len; i++) {
+           rb_ary_push(ary, INT2FIX(RSTRING(str)->ptr[i] & 0xff));
+       }
+       return ary;
+    }
+
     for (i=0; i<RSTRING(str)->len; i++) {
        rb_yield(INT2FIX(RSTRING(str)->ptr[i] & 0xff));
     }
@@ -4317,6 +4326,29 @@

 /*
  *  call-seq:
+ *     str.each_char                   => array
+ *     str.each_char {|str| block }    => str
+ *
+ *  Passes each byte in <i>str</i> to the given block.
+ *
+ *     "hello".each_char {|str| print str, ' ' }
+ *
+ *  <em>produces:</em>
+ *
+ *     h e l l o
+ */
+
+static VALUE
+rb_str_each_char(str)
+    VALUE str;
+{
+    VALUE re = rb_reg_compile(".", 1, ONIG_OPTION_MULTILINE);
+    return rb_str_scan(str, re);
+}
+
+
+/*
+ *  call-seq:
  *     str.hex   => integer
  *
  *  Treats leading characters from <i>str</i> as a string of
hexadecimal digits
@@ -4754,6 +4786,7 @@
     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, "sum", rb_str_sum, -1);

-- 
NARUSE, Yui  <naruse / airemix.com>
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA