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クラスの拡張の方が良いのか。もしくはもっと良い書き方が他にもありそう。