[#954] Rational — keiju@... (Keiju ISHITSUKA)

けいじゅ@SHLジャパンです.

23 messages 1996/10/30
[#955] Re: Rational — matz@... (Yukihiro Matsumoto) 1996/10/30

まつもと ゆきひろです.

[#968] Re: Rational 1996/10/31

けいじゅ@SHLジャパンです.

[ruby-list:906] [REQ]Get Strings!<3> GETS, SUB

From: Shin-ichiro Hara <sinara@...>
Date: 1996-10-27 10:26:43 UTC
List: ruby-list #906
原です。

(7)String#gets がほしい。

これはつまりリードポインタつき String クラスがあったらなあ、とい
うことです。tell, seek が出来たりするわけです。

このクラスは結構使い出があるんではないかと思うのですが、例えば複行
レコードの各フィールドに番号を振りたいとき、こう書ける。

$/ = "\n\n"
while record = gets
  ln = 1
  while field = record.gets("\n")
    print ln,":", filed, "\n"
    ln += 1
  end
end

ストリームを gets で切り分けるように文字列も gets で分けるわけです。
さらに field を , で分けたいときは while subfield = field.gets(",") .. 
などとできるので、while が自然な形で並びます。更に悪乗りして

while record = (IO or String).gets(""\n\n", "\n", ",")
  # record は 2 重配列
end

とか、

record = (IO or String).readlines("\n\n", "\n", ",") # 3 重配列

とかはどうでしょうか。split という名前でもいけど。

しかし $_.gets が $_ = $_.gets の意味になったらまずい。ほかの +, [a,b]
などのメソッドをポインタにどう作用させたらいいか考える必要があるけど。

#と、ここまで書いて、ちょっと違うけど String#each_line というがある
#ことに気付きました。String#each_line(RS) ができれば、このイテレー
#タで済む場合もありますね。


(8)イッキ sub, gsub がほしい。

ruby には、strip などという便利なメソッドがあるけど、これは、sub で
書くと gsub(/^\s+|\s+$/, '') となります。しかしこれが sub でなくて
gsub であることは、本来の意味から考えるとかっこ悪い。sub を2つ並べ
るのはメンドくさい。これを

sub(/^\s+/, '', /\s+$/, '')

と書くわけです。さらに、こっちが重要なんですが、

gsub(/a/, 'b', /b/, 'c')  # a -> b, b -> c だが a -> c とはならない

などとできる。gsub(Hash) もあり。順番つきとしたら gsub(Array1, Array2)
の方がいいかな。イテレータにするときの仕様が難しいかしら。

(つづく)
----------------------------------------------------------
                                                  原信一郎

In This Thread

Prev Next