成瀬です。
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