From: Minero Aoki Date: 2004-08-02T20:40:51+09:00 Subject: [ruby-dev:24016] Re: String#each -> String#each_char 青木です。 In mail "[ruby-dev:24015] Re: String#each -> String#each_char" WATANABE Hirofumi wrote: > わたなべです。 > > * each_line が each でなくなると不便 > > (行単位の each や map や select を活用しているから) > > > > * 文字単位の each があっても不便 > > (map とか select とか inject を使う場面に出会ったことがない) > > (Rubyレベルで文字単位に処理するのは遅すぎて使いものに > > ならなかった経験がある。正規表現を活用したほうがずっといい) > > どちらも結局文字単位での処理が遅いから、行単位で扱っていると > いう話になりそうな。 速度だけを根拠にしているつもりは全くありません。わたしが使って いる (自作の) ライブラリは文字列を中間形態にすることが多く、 かつ行単位のフォーマットをよく使うから、多段の変形をかけるときに 文字列 each が増えざるをえないのです。あと、フォーマット変換中の 部分文字列を扱う時も使います。(例:BitChannel の pre 部分とか) あとは、SOME_CLASS#parse と SOME_CLASS#load を両方用意するときに 共通のインターフェイスとして each を使うとか、load で全部読んで から parse に渡すとか。こういう使いかたをしている場合に問題になって いるのは意味とかコード共有であって、速度は関係しません。 > > 他の傍例としては、IO#each が「行」を単位に選んでいることが挙げら > > れます。IO#each を each_byte や each_block (ないけど) の alias に > > することも可能だったはずです。この事実は、文字列のかたまりを扱う > > 場合は行を単位として扱うのが *現実的に便利だ* ということを表して > > いるのではないでしょうか? > > 便利かどうかと言われると複数行含んだ文字列を扱うことがどれく > らい多いかという話になると思います。現にIO#eachで1行ずつ持っ > てくればString#each_lineの出番はなくなりますし。 > > それともここもreadで全部読みこんだ後の話になりますか? > だとするとやはり速さの問題なのかなあ。 上記の通り、まず第一には何段も変形するときの中間形態の問題です。 それから、わたしは IO#each と String#each の関係も同時に問題に しています。それなのに、「IO#each が行単位だから String#each は なんでもいいじゃん」と IO#each の現状の動作を前提とされるのは 納得できません。 ------------------------------------------------------------------- 青木峰郎