Rubyで組み込みクラスを拡張する

Rubyで文字列の末尾を自分が入力した文字だけ消してくれるメソッド欲しいなぁと思い、適当に書き始めた。

str = "123456789"
num = 3

str.slice!((str.length - num)..str.length)

p str

なんかこれ微妙だな……。

この文字列を消す処理、複数の場所で使うからもうちょっとシンプルで良い感じに書きたい。

def tailSlice(num)
  self.slice!((self.length - num)..self.length)
  return self
end

str = "123456789"

p str.tailSlice(3)
# private method `tailSlice' called for "123456789":String (NoMethodError)

上記のコードは当然だけどうまくいかない。

strが文字列だからStringクラスで、そのStringクラスにtailSliceなんてメソッドは無いからエラーになります。というわけで、こういう時はString拡張をしてしまう。

class String
  def tailSlice(num)
    self.slice!((self.length - num)..self.length)
    return self
  end
end

str = "123456789"

p str.tailSlice(3)
# "123456"

できました。とりあえず望み通りの動作。

でもよくよく考えたら

str = "123456789"
num = 3

str.slice!(-num,num)

p str

こんな感じの書き方もできたか……。まあ毎回.slice!書くのも微妙だし、Stringクラスの拡張の方が良いのか。もしくはもっと良い書き方が他にもありそう。