Rubyの技: 文字列操作で便利かつ高速なdelete_prefixとdelete_suffix(翻訳)
私がRubyを書くのが好きな理由のひとつは、プログラマーが幸せになれるように最適化されているからです。Rubyコミュニティは非常に読みやすいコードを重視しています。
他のエコシステムから来たプログラマーは、Rubyがまるで疑似コードのように見えることにショックを受けることがよくあります。Ruby標準ライブラリやActive Supportのような拡張機能のおかげで、Rubyではコードを自然な方法で書けます。
その好例として、Stringクラスのdelete_prefix
メソッドとdelete_suffix
メソッドをご紹介します。
使い方
delete_prefix
は文字どおり、文字列の冒頭からサブ文字列を削除できます。
"BoringRails!".delete_prefix("Boring")
#=> "Rails!"
"#programming".delete_prefix("#")
#=> "programming"
"ISBN: 9780091929787".delete_prefix("ISBN: ")
#=> "9780091929787"
"mailto:test@example.com".delete_prefix("mailto:")
#=> "test@example.com"
github_url = "https://github.com/rails/rails"
repo_name = github_url.delete_prefix("https://github.com/")
#=> "rails/rails"
gsub
などの既存のメソッドと比べてみましょう。
github_url = "https://github.com/rails/rails"
repo_name = github_url.gsub("https://github.com/", "")
#=> "rails/rails"
gsub
は正規表現を受け取ることも複数箇所の置き換えもできる柔軟なメソッドですが、delete_prefix
ほど自然な書き方ではありません。しかも、delete_prefix
はgsub
よりも高速なのです。
文字列の末尾からサブ文字列を削除したい場合の選択肢は、chomp
またはdelete_suffix
です。
"report.csv".chomp(".csv")
#=> "report"
"report.csv".delete_suffix(".csv")
#=> "report"
"150 cm".delete_suffix("cm").to_i
#=> 150
スタイル上の観点では、chomp
というメソッド名はRubyの中では少々毛色が違います1。一方delete_suffix
というメソッド名はdelete_prefix
と対になっていることがはっきりわかります。なお、chomp
とdelete_suffix
のパフォーマンスはsub
よりも高速です。
参考資料
- Ruby APIドキュメント: String#delete_prefix (Ruby 3.0.0 リファレンスマニュアル)
-
Ruby APIドキュメント: String#delete_suffix (Ruby 3.0.0 リファレンスマニュアル)
-
Ruby Bug Tracker: Feature #12694: Want a String method to remove heading substr - Ruby master - Ruby Issue Tracking System
-
文字列メソッドのベンチマーク: Fast Ruby - String
関連記事
https://techracho.bpsinc.jp/hachi8833/2021_04_22/107386
-
訳注: Perlには以前から
chomp
メソッドがあり、Rubyのchomp
はおそらくPerlの影響でこのメソッド名になったと思われます。参考: Ruby - chompって何かの略ですか?|teratail ↩
概要
原著者の許諾を得て翻訳・公開いたします。
日本語タイトルは内容に即したものにしました。