はじめに
先日、【Ruby】すぐ出来る!&:
による簡単リファクタリング - Qiitaという記事を書かせて頂きました。
今回も知っていると大幅に行数削減が出来るtr
メソッドを使用したリファクタリング事例を記載します。
この記事が役に立つ方
- とりあえず動くプログラムは作れる
- でもシンプルなコードを書く引き出しを持っていない
- Ruby初心者
この記事のメリット
-
tr
メソッドの有用性を理解し、置換が必要なシーンに活用出来るようになる。
環境
- Ruby 2.6.3
tr
メソッドとは
RubyのStringクラスに標準搭載されている文字列を置換するメソッド。
↓Rubyリファレンスマニュアルはこちら。
instance method String#tr (Ruby 2.6.0)
以下、Rubyリファレンスマニュアルの例を引用させて頂きます。
p “foo”.tr(“f”, “X”) # => “Xoo”
p “foo”.tr(‘a-z', ‘A-Z’) # => “FOO”
p “FOO”.tr(‘A-Z’, ‘a-z’) # => “foo”
この例では分かりづらいかもしれませんが、このtr
メソッドのいいところは**「対象の文字がどの位置にあっても置換してくれる」**ということです。
例えば一番上の例では置換対象がfoo
でしたが、ofo
でもoof
でも、ちゃんとoXo
、ooX
のように置換されます。
以下で具体例を見てみましょう。
具体例
例として、以下のようなA,B,C,Dの4文字から構成される任意の文字列string
があるとします。
文字列の長さは任意、使用文字だけが上記4文字に制限されていて、順番はランダムです。
そして、定義するreplace
メソッドでやりたいことは以下のような文字列の置換です。
- A⇔B
- C⇔D
さあ、皆さんならどう解きますか?
入力と出力の関係は以下のようになります。
“ADBBC”
# => “BCAAD”
“DBBCAAC”
# => "CAADBBD”
ちなみにtr
メソッドを知らなかった自分の回答は以下の通りです…
14行もあります。
文字列をsplit
で一旦配列にバラし、それぞれをcase
文で判定・置換してからjoin
で配列を文字列に戻す、という内容。
無駄に長い!
def replace(string)
string.split(“”).map do |s|
case s
when “A”
s = “B”
when “B”
s = "A"
when “C”
s = “D”
when “D”
s = “C”
end
end.join
end
tr
メソッドを使ったプロフェッショナルの回答は以下の通り!
たった3行!
11行も削減!
ポイントは**「対象の文字がどの位置にあっても置換してくれる」**ことですね。
def replace(string)
string.tr(“ABCD”, “BADC”)
end
おわりに
同じような置換メソッドでgsub
がありますが、これは正規表現を使うシーンで有効らしいですね。
リファクタリングの鬼になりたいです。
参考にさせて頂いたサイト(いつもありがとうございます)
Train with Programming Challenges/Kata | Codewars
instance method String#tr (Ruby 2.6.0)