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