Re: Ruby1.9String $B!%P%$%HNs$X$N%$%s%G%C%/%9!%"%/%;%9(B

e$B$A$J$_$K!"e(Bbyte e$B$N$G$O$J$/e(B bytes e$B$NJ}$,BEEv$@$H;W$$$^$9!#e(B

s = “abcde”
s.byte # "abcde"e$B$N%P%$%HNs%*%V%8%’%/%He(B
s.byte[3] # => 100

e$B$3$l$OB?J,e(B s.byte[3].ord e$B$G2fK}$G$-$k$N$G$O$J$$$+$H<+J,$G$O;W$$$^$9$,!"e(B
e$B$$$+$,$G$7$g$&$+!#e(B

e$B$9$_$^$;$s!#:G=i$N%a!<%k$,D9$9$.$?$N$G!"e(B
e$BO@E@$,$D$+$a$J$+$C$?$+$b$7$l$^$;$s!#e(B

e$B;d$N8@$$$?$+$C$?$N$O!"!Ie(BSubstringe$B$r2p$7$J$$!Ie(B
Ruby1.8e$B$^$G$N$h$&$J!“e(B
e$B%P%$%HNs$X$N%”%/%;%9%a%=%C%I$O$J$$$N$+$H$$$&$3$H$G$9!#e(B

e$B$=$&$$$&$b$N$,$J$$$H!“e(B[ruby-dev:33186]e$B!!$J$I$G=R$Y$?$h$&$Je(B
e$B%S%C%H%^%C%W2hA|$K$$+$7$r$$$l$k2hA|=hM}A:n$J$I$G!"e(B pixele$B?t!J?t%a%,$K$b$J$k!K$Ne(B10e$BG\$N8D?t$N0lJ8;ze(BStringe$B$,e(B e$B@8@.$5$l$F$7$^$&!"$H$$$&$b$N$G$7$?!#e(B e$B$3$l$OK\Ev$Ke(BHugee$B$G$O$J$$$G$7$g$&$+!)e(B e$B$3$N$h$&$JA:n$be(BRuby1.8e$B$^$G$O!”%*%V%8%’%/%H@8@.?t%<%m$Ge(B
Fixnume$B$N$_$r;H$C$F9T$($F$$$?$N$G$9!#e(B

e$BB>$NNc$H$7$F!“Nc$($P!”%S%k%H%$%s$5$l$F$$$J$$e(B
e$B?7$?$J!!e(BEncodinge$B!!$r!!e(BRubye$B!!e(BScripte$B$G=q$/$H$7$?$i!“e(B
Ruby1.9e$B$h$je(BRuby1.8e$B$^$G$Ne(BStringe$B$N$[$&$,!”$O$k$+$KAGD>$Ke(B
e$B$+$1$k$N$G$O$J$$$+$H$$$&LdBjDs5/$b@h$N%a!<%k$G$O$7$F$$$^$7$?!#e(B

e$B$h$C$F!"e(Bs[3].ord e$B$d!!e(Bs.byte[3].ord
e$B$J$I$O$D$i$9$.$k$H$$$&$H$3$m$,e(B
e$B5DO@$N=PH/E@$J$N$G$9!#e(B

e$B$^$?!“e(B[]=e$B$,e(BStringe$B!!$be(BIntegere$B$b%”%/%;%W%H$9$k$H$$$&$N$Oe(B
e$B$h$$$H;W$&$N$G$9$,!"e(BString#[] e$B$O$I$A$i$+$7$+JV$;$J$$$?$a!"e(B
e$BFI$9~$!&=q$-9~$_$NHsBP>N@-$,$I$&$7$F$b$G$F$-$^$9$,!"e(B
e$B$=$l$O2fK}$9$k$h$j;EJ}$N$J$$$3$H$G$7$g$&$+!)e(B

e$B$3$N$h$&$JLdBj$r$9$Y$F2r7h$9$k$?$a$Ke(B
e$B$k$S$-$A$5$s$Oe(BByteArraye$B$r9M$($F$/$@$5$C$?$N$@$H;W$$$^$9!#e(B

e$B!J$H$3$m$G!!e(Bbytee$B!!$H$$$&C1?t7A$NL>>N$Oe(BString#bytese$B!!e(B=>Enumerator
e$B!!$,$b$&$"$k$+$i$G$O$J$$$G$7$g$&$+!)e(B
e$B!!%9%Z%k%_%9$7$d$9$$$H$$$&LdBj$O$"$k$H;W$$$^$9!#!Ke(B

e$B$h$m$7$/$*4j$$CW$7$^$9!#e(B

e$B%P%s%5%s$G$9!#e(B

On Jan 20, 2008, at 11:57 AM, Hisanori Kiryu wrote:

e$B!J$H$3$m$G!!e(Bbytee$B!!$H$$$&C1?t7A$NL>>N$Oe(BString#bytese$B!!e(B
=>Enumerator
e$B!!$,$b$&$"$k$+$i$G$O$J$$$G$7$g$&$+!)e(B
e$B!!%9%Z%k%_%9$7$d$9$$$H$$$&LdBj$O$"$k$H;W$$$^$9!#!Ke(B

e$B$G$b$3$Ne(BEnumeratore$B$Ke(B[]e$B$r;H$&$h$&$K$J$C$?$i$$$$$se(B
e$B$8$c$J$$$G$9$+!#e(B
e$B$3$l$O$I$&$G$7$g$&$+!'e(B
s = ‘a’
s.bytes[0] # => 97
s.bytes[i] = 98
s # => ‘b’
s.bytes[0] = ‘c’ # 'c’e$B$ND9$5$,e(B1e$B%P%$%H$8$c$J$+$C$?$iNc30e(B
e$B$rH/@8e(B
s # => ‘c’

e$B$=$7$Fe(B(e$B6Q<A@-$N$?$a$G$b$"$k$,e(B)e$B$=$l$b$I$&$G$7$g$&$+!'e(B
str.lines[i] # => ie$BHVL$N9TNs$rJV$9e(B
str.chars[i] # => ie$BHVL$NJ8;z$rJV$9e(B (str[i]e$B$HF1$8e(B)

str.lines[i] # => ie$BHVL$N9TNs$rJV$9e(B
str.chars[i] # => ie$BHVL$NJ8;z$rJV$9e(B (str[i]e$B$HF1$8e(B)

e$B$9$_$^$;$s!#e(B

e$B$h$/$*$C$7$c$k$$$_$,$o$+$j$^$;$s$G$7$?!#e(B

e$B9=J8$H$7$F$O$J$s$NLdBj$b$J$/!"e(B
e$B;d$,I,MW$H$7$F$$$k$h$&$J$b$N$G$9$,!#e(B

Enumeratore$B0lHL$K%$%s%G%C%/%9%"%/%;%9$9$k%a%=%C%I$r2C$($ke(B
e$B$H$$$&$o$1$G$O$J$$$N$G$9$h$M!)e(B
e$B!Je(B[]=,[], e$B$r$b$D$h$&$J!"e(BEnumerator
e$B$Ne(BSubClasse$B!!$+2?$+!)!Ke(B

Bytee$BNs$N>l9g$K7W;;NL$,%9%H%j%s%0$ND9$5$K4X$7$Fe(BO(1)
e$B$N%$%s%G%C%/%9%"%/%;%9$J$N$G$9$h$M!)e(B
e$B$7$+$bItJ,J8;zNs$J$I$N%*%V%8%’%/%H$rCf4V$G@8@.$7$J$$!)e(B

e$B$=$l$G$7$?$iAG@2$i$7$$$H;W$$$^$9!#e(B

e$B6M@8$5$s!"$3$s$K$A$O!#e(B

At 19:57 08/01/20, Hisanori Kiryu wrote:

e$BO@E@$,$D$+$a$J$+$C$?$+$b$7$l$^$;$s!#e(B
e$B$3$N$h$&$JA`:n$be(BRuby1.8e$B$^$G$O!"%*%V%8%'%/%H@8@.?t%<%m$Ge(B
Fixnume$B$N$_$r;H$C$F9T$($F$$$?$N$G$9!#e(B

e$B%a!<%k$NFI$`=gHV$,%P%i%P%i$K$J$j$^$7$?$N$G!"6M@8$5$s$NA0$N%a!<%ke(B
e$B$rFI$^$:%a!<%k$r=q$$$F$7$^$$$^$7$?!#e(B

e$B@N2hA|=hM}$rBgJ,$d$j$^$7$?$N$G!"LdBj$OJ,$+$j$^$9!#e(B

e$BBeF~$OJ}$,0c$&$N$G!“LdBj$r2r7h$G$-$k$,!”<h$j=P$7$N>l9ge(B
e$B$ONc$($Pe(B string.get_byte e$B$H$+$O$I$&$G$7$g$&$+!#e(B
e$BM>$j$+$C$3$h$/$J$/$F!"%k%S$i$7$/$J$$$G$9$,!"Aa$/$J$k$H$O;W$$$^$9!#e(B

e$B59$7$/$*4j$$$7$^$9!#e(B Martin.

#-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University
#-#-# http://www.sw.it.aoyama.ac.jp mailto:[email protected]

e$B%P%s%5%s$G$9!#e(B

On Jan 20, 2008, at 12:44 PM, Vincent I. wrote:

e$B$3$l$O$I$&$G$7$g$&$+!'e(B
s = ‘a’
s.bytes[0] # => 97
s.bytes[0] = 98
s # => ‘b’
s.bytes[0] = ‘c’ # 'c’e$B$ND9$5$,e(B1e$B%P%$%H$8$c$J$+$C$?$iNce(B
e$B30$rH/@8e(B
s # => ‘c’

e$B35G0Z$N$?$a!":n$C$F$_$^$7$?!#e(B
e$BCm0U!’<BAu$O$R$I$$!JFC$Ke(BEnumeratore$B$+$ie(BStringe$B$rFIe(B
e$B$_9~$`J}K!!K$7e(BRangee$B$bBP1~$G$-$J$$$G$9!J<B$Oe(BRange
e$B$r<u$1$k$Y$-$+$I$&$+$O$o$+$j$^$;$s!K!#e(B

Index: string.c

— string.c (revision 15145)
+++ string.c (working copy)
@@ -4521,7 +4521,80 @@
return str;
}

+struct enumerator {

  • VALUE method;
  • VALUE proc;
  • VALUE args;
  • rb_block_call_func *iter;
  • VALUE fib;
  • VALUE dst;
  • VALUE no_next;
    +};

+static VALUE
+rb_str_bytes_aref(VALUE obj, VALUE indx)
+{

  • long idx, len;
  • struct enumerator *ptr;
  • VALUE str;
  • Data_Get_Struct(obj, struct enumerator, ptr);
  • str = rb_funcall(ptr->method, rb_intern(“receiver”), 0);
  • idx = FIX2LONG(indx);
  • len = RSTRING_LEN(str);
  • if (idx < 0)
  • idx += len;
  • if ((idx < 0) || (idx >= len))
  • return Qnil;
  • return INT2FIX(RSTRING_PTR(str)[idx] & 0xff);
    +}

+static VALUE
+rb_str_bytes_aset(VALUE obj, VALUE indx, VALUE val)
+{

  • long idx, len, v;
  • struct enumerator *ptr;
  • VALUE str;
  • Data_Get_Struct(obj, struct enumerator, ptr);
  • str = rb_funcall(ptr->method, rb_intern(“receiver”), 0);
  • idx = FIX2LONG(indx);
  • len = RSTRING_LEN(str);
  • if (idx < 0)
  • idx += len;
  • if ((idx < 0) || (idx >= len))
  • rb_raise(rb_eIndexError, “index %ld out of string”, FIX2LONG(indx));
  • switch (TYPE(val)) {
  •  case T_FIXNUM:
    
  • v = FIX2LONG(val);
  • RSTRING_PTR(str)[idx] = (v & 0xff);
  • break;
  •  case T_STRING:
    
  • if (RSTRING_LEN(val) != 1) {
  •  rb_raise(rb_eTypeError,
    
  •     "type mismatch: the string must be one byte long",
    
  •     rb_obj_classname(val));
    
  • }
  • RSTRING_PTR(str)[idx] = RSTRING_PTR(val)[0];
  • break;
  •  default:
    
  • rb_raise(rb_eTypeError, “type mismatch: %s given”,
  • rb_obj_classname(val));
    
  • }
  • return val;
    +}
  • /*
    • Document-method: bytes
    • call-seq:
      @@ -4553,7 +4626,14 @@
      {
      long i;
  • RETURN_ENUMERATOR(str, 0, 0);
  • if (!rb_block_given_p()) {
  • VALUE enumerator;
  • enumerator = rb_enumeratorize(str, ID2SYM(rb_frame_this_func()), 0,
    0);
  • rb_define_singleton_method(enumerator, “[]”, rb_str_bytes_aref, 1);
  • rb_define_singleton_method(enumerator, “[]=”, rb_str_bytes_aset, 2);
  • return enumerator;
  • }
    for (i=0; i<RSTRING_LEN(str); i++) {
    rb_yield(INT2FIX(RSTRING_PTR(str)[i] & 0xff));
    }