日記帳

日記です。

String オブジェクトを破壊的に空文字列化

Ruby の String *1 クラスっていうのはまるで文字列を扱うクラスのような名前です.でも実際はバイト列を格納するためのコンテナクラスなんだと思う.ASCIIコードの範囲外の文字を文字単位で扱えないですし(もちろんjcode.rb*2を使えば日本語限定で文字単位での操作はできるけれども).

コンテナとして考えてみると中身を破棄してコンテナだけ使いまわしたりしたいことがあります.極まれにですけども.例えば以下のような場合に.

string = ''
printer = Misen::AcqExpandPrinter.new(string)

printer.expand_nodes(sgml, data1)
output(string)

# ここで string の中身を空にする

printer.expand_nodes(sgml, data2)
output(string)

きっとString#clear() とかあるのだろうと思ってString クラスのリファレンスマニュアルを探してみるとありました.いや、あったけど "ruby 1.9 feature" と書いてある.つまり 1.8 にはないってことですか.

で,同等の結果が得られそうな方法を考えてみました.とりあえず以下の4つ.

  1. str.replace('')
  2. str.slice!(0..-1)
  3. str[0..-1] = ''
  4. str.sub!(/.*/, '')

うーん…どれもあまり内容をクリアしてるっぽく見えないですね… str.replace('') がかろうじて解り易いかもしれません.まぁ見た目はString#clear()を定義してやればいいんですけど…