LoginSignup
3
1

More than 3 years have passed since last update.

【Ruby】すぐ出来る!`tr`メソッドによる簡単リファクタリング

Posted at

はじめに

先日、【Ruby】すぐ出来る!&:による簡単リファクタリング - Qiitaという記事を書かせて頂きました。

今回も知っていると大幅に行数削減が出来るtrメソッドを使用したリファクタリング事例を記載します。:blush:

この記事が役に立つ方

  • とりあえず動くプログラムは作れる
  • でもシンプルなコードを書く引き出しを持っていない
  • 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でも、ちゃんとoXoooXのように置換されます。

以下で具体例を見てみましょう。

具体例

例として、以下のようなA,B,C,Dの4文字から構成される任意の文字列stringがあるとします。
文字列の長さは任意、使用文字だけが上記4文字に制限されていて、順番はランダムです。

そして、定義するreplaceメソッドでやりたいことは以下のような文字列の置換です。
1. A⇔B
2. C⇔D

さあ、皆さんならどう解きますか?
入力と出力の関係は以下のようになります。

“ADBBC”
# => “BCAAD”

“DBBCAAC”
# => "CAADBBD”

ちなみにtrメソッドを知らなかった自分の回答は以下の通りです…
14行もあります。

文字列をsplitで一旦配列にバラし、それぞれをcase文で判定・置換してからjoinで配列を文字列に戻す、という内容。

無駄に長い!

My_solution
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行も削減!
ポイントは「対象の文字がどの位置にあっても置換してくれる」ことですね。

Pro_solution
def replace(string)
  string.tr(ABCD, BADC)
end

おわりに

同じような置換メソッドでgsubがありますが、これは正規表現を使うシーンで有効らしいですね。

リファクタリングの鬼になりたいです。:relaxed:

参考にさせて頂いたサイト(いつもありがとうございます)

Train with Programming Challenges/Kata | Codewars
instance method String#tr (Ruby 2.6.0)

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1