From: "NARUSE, Yui" Date: 2008-01-28T21:12:36+09:00 Subject: [ruby-dev:33472] Re: Ruby1.9 String バイト列へのインデックス アクセス 成瀬です。 Yukihiro Matsumoto wrote: > まつもと ゆきひろです > > In message "Re: [ruby-dev:33445] Re: Ruby1.9 String バイト列へのインデックス アクセス" > on Mon, 28 Jan 2008 15:40:28 +0900, "NARUSE, Yui" writes: > > |Nobuyoshi Nakada wrote: > |> String::ByteIndexerとか。 > | > |あぁ、作ろうかなぁと思っていたものがすでに、というわけで一票。 > > そうなのか。 えぇ、 > |String::ByteIndexerとか。 > > うーん、どうしようかなあ。専用クラス化した方が性能が上がると > かいいこともあるんですがねえ。でも、byteアクセスとbyte列挙子 > を同一視することになんとなく抵抗感があります。 とも関連するのですが、ここにおける「Indexer」は「Enumerator」の特殊な場 合、つまり、ランダムアクセス可能かつ key が 0 から始まる整数である 「Enumerator」になっています。つまり、まさに Array と同じ API を持ってい るわけです。 例えば、bytes というのはまさにこの特殊な Enumerator に該当します。また String#chars も「ランダムアクセス可能」と言うことになっているので、これ も「Indexable」です。Array などは当然そうです。組み込み・標準添付ライブ ラリを見てみると、ENV や Dir、Range、dbm に gdbm、Orderd Hash だってそう です。 逆にこれに当てはまらない Enumerable は String#lines が微妙だったり、 mathn の Prime だったりと、実は少数派に見えます。 > |こういうのを妄想していて思ったのですが、今の Enumerable と Enumerator の > |ように、Indexable と Indexer に一般化できると思うのですが、そういった > |ニーズってあるのですかねぇ。この方向の先には LazyList が待っていると思っ > |ているのですが。 > > IndexableってEnumerableみたいなtemplate patternが効く余地が > あまりないような気がするんですが。なんか、「[]が使えるとそれ > をベースに実装できるメソッド」ってありましたっけ? > > LazyListっぽい進化の方向はアリだと思ってはいるのですが。 > IndexableってEnumerableみたいなtemplate patternが効く余地が > あまりないような気がするんですが。なんか、「[]が使えるとそれ > をベースに実装できるメソッド」ってありましたっけ? > > LazyListっぽい進化の方向はアリだと思ってはいるのですが。 というわけで、この場合はただの getter/setter でなく、enumerable なという 限定がつくため、これに加えて [] と []= があれば Array の全てが実装可能です。 self[nth] self[start..end] self[start, length] self[nth]=val self[start..end]=val self[start, length]=val at fetch slice slice! # 定義より + << concat # self[3,0] = val に書き換える * # [0..-1]をひっぱってきて、n回足す - & | # 一つずつ見る <=> == assoc fill flatten include? index join nitems pack rassoc reverse reverse_each rindex sort indexes to_a to_ary uniq transpose # enumerator でも実装可能 flatten! map! reject! replace reverse! sort! uniq! # enumerator + aset で実装可能 clear # str[0..-1] = [] clone dup to_s # Object collect! # enum して str[0..-1] = でつっこむ compact compact! #enum delete delete_at delete_if # なめてから aset each each_index # 定義より empty? # str[0..-1] でわかる eql? # Object first # str[0] values_at # str[n] を呼ぶ insert str[nth, 0] = val last # str[-1] length size # 実装上 Indexer は知っている pop # str[-1..-1] = nil push # str[len-1, 0] = val shift # str[0..0] = nil unshift # str[0, 0] = val -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA