LoginSignup
1
1

More than 1 year has passed since last update.

sliceメソッドでマイナスを使って末尾から切り取る

Last updated at Posted at 2021-05-17

はじめに

超基本的なことですが、全然知らなかったことが恥ずかしいので、こちらに記載しておきます

問題

以下のようなプログラムを書きなさいという問題において、sliceメソッドの新しい使い方を発見しました

「問題1」
任意の2つの文字列があります。
どちらかの文字列がもう一方の文字列の最後にある場合はTrueを、ない場合はFalseを出力するプログラムを作りましょう。大文字と小文字は区別されません。

例えば、'world'と'helloworld'を渡した場合はTrueとなります。左側の'world'が右側の文字列の最後にあるからです。一方、'world'と'worldhello'とした場合はFalseとなります。右側の文字列には'world'が含まれているものの、文字列の最後に無いためです。

自身が書いたコード

def end_other(a,b)
    a_down=a.downcase
    b_down=b.downcase
    a_len=a_down.length
    b_len=b_down.length

    if a_len >= b_len
        tmp=a_down.slice(a_len - b_len ..a_len )
        if tmp==b_down
            return true
        end
        return false
    else
        tmp=b_down.slice(b_len-a_len..b.len)
        if tmp==b_down
            return true
        end
        return false
    end
end

puts "#{end_other("abdcHSasd","asd")}"

かなり冗長です。今回、何が問題かと言うと、いちいちどちらの文字列が長いかを判定して、その上で末尾を切り取って、一致するかどうかを確認しています。これでは、かなりコード量が増えてしまいます

sliceメソッドにマイナスを使って改善した場合

まずは改善した場合を見てみます。かなりスッキリしています。

def end_other(a, b)
  a_down = a.downcase
  b_down = b.downcase
  a_len = a_down.length
  b_len = b_down.length
  if b_down.slice(-(a_len)..- 1) == a_down || a_down.slice(-(b_len)..- 1) == b_down
    puts "True"
  else
    puts "False"
  end
end

改善したパターンでは、sliceメソッドでマイナス表記を使ったこと、if文の工夫をしました。

sliceのマイナス表記は見慣れないと思いますが、とても簡単な仕組みです。
単純に末尾から数えているだけです。
ただし、0からではないことに気をつけてください!

string.slice(-5,-1)#末尾から数えて1文字〜5文字目をカット

このメソッドを使うとif文もかなりスッキリします。

ちなみに余談ですが今回のようなif文を、AまたはBという覚え方をする方がいますがそれはお勧めしません。
以下のように覚えるとかなり見慣れない表記にもすんなり対応できます(ここの説明は割愛します)

if ここの条件部がfalseならば || こちらの処理を返す

他のメソッド

end_with?というメソッドもあるみたいです!!
勉強になりますね!
https://docs.ruby-lang.org/ja/3.0.0/method/String/i/end_with=3f.html

終わりに

基礎の基礎をしっかり押さえることは本当に重要ですね。使えればいいではなく、使ってどんなことができるかや他にどんな使い方があるのかなど深ぼることが重要かと思います。
皆様も普段使われているメソッドを見直してみてはいかがでしょうか

1
1
2

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
1
1