はじめに
超基本的なことですが、全然知らなかったことが恥ずかしいので、こちらに記載しておきます
問題
以下のようなプログラムを書きなさいという問題において、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
終わりに
基礎の基礎をしっかり押さえることは本当に重要ですね。使えればいいではなく、使ってどんなことができるかや他にどんな使い方があるのかなど深ぼることが重要かと思います。
皆様も普段使われているメソッドを見直してみてはいかがでしょうか