Ruby 2.5 の String クラスに文字列から接頭辞や接尾辞を削除する delete_prefix と delete_suffix メソッドを追加しました。

'foobar'.delete_prefix('foo') #=> 'bar'
'foobar'.delete_suffix('bar') #=> 'foo'

いままでは、接頭辞の削除をするのに

'foobar'.sub(/^foo/, '') #=> 'bar'

のようにしている人が多かったと思いますが、このコードは正規表現を使うことになるので遅いです。高速に削除するには

'foobar'[3..-1] if 'foobar'.start_with?('foo')

のようにする必要があったのですが、これは面倒ですね。これを String#delete_prefix を呼ぶだけで行うことができるようになりました。

String#delete_suffix は String#chomp でも大体の場合で代用できていたのですが、対称性のために追加したものになります。* 正確には '\n' を指定した時の挙動が chmop は少し特殊なので、その特殊な挙動をしない delete_suffix を入れても良いのでは?という話になり、入れることになりました。

この機能を提案して ruby 本体にコミットしたモチベーションとしては、Fluentd にタグという概念があって、そのタグの文字列処理をするのに頻出するパターンだったというのがあります。Fluentd 以外でも、絶対パスの先頭を削って相対パスに変換する場合などに使えると思い、Fluentd ではなくて Ruby 本体に入れさせてもらいました。他の golang などの言語にもある機能なので、言語自体に入るのはおかしなことでもないと思います。

String という重要なクラスに機能を追加したので Ruby コミッタらしいことをしたな〜と思うなどしました。