LoginSignup
1
0

More than 3 years have passed since last update.

【Ruby】downcase,sliceメソッドの応用

Last updated at Posted at 2020-11-16

「a = "abc"」,「b = "HiAbc"」という二つの変数がある時、a,bいずれかの文字列がもう片方の文字列の最後にある場合にTrueを返すプログラムの作成方法です。
今回の場合、aのabcがbの後ろ三文字に存在するためTrueとなります。

以下二つのメソッドを使用することで作成することができます。

メソッドの使用例

  • 大文字を小文字に変換するためにはdowncaseメソッド
ruby
a = "AbC"
a_down = a.downcase
// これにより a_down には abc が入る
  • 特定の位置にある文字列などを切り抜きたい場合はsliceメソッド
ruby
a = "AbC"
a_slice = a.slice(1)
// これにより a_slice には b が入る

回答例

ruby
def compare(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

解説

2~5行目でこの後に使用する変数の定義をしています。

ruby
a_down = a.downcase    // aの文字列を全て小文字化してa_downに代入
b_down = b.downcase    // bの文字列を全て小文字化してa_downに代入
a_len = a_down.length  // a_downの文字列の長さをa_lenに代入
b_len = b_down.length  // a_downの文字列の長さをa_lenに代入

その後、以下のif文で判定しています。

ruby
if b_down.slice(-(a_len)..- 1) == a_down || a_down.slice(-(b_len)..- 1) == b_down
  puts "True"
else
  puts "False"
end

「b_down.slice(-(a_len)..-1 == a_down」を日本語訳すると、「b_downの右から1〜a_len部分を切り取る」となります。
仮にa_lenが「3」、b_downが「hiabc」という5文字だったとして、「hiabcの右から1〜3文字を切り取る」となります。すると切り取った文字列は「abc」となります。
sliceメソッドは正の値を渡すと先頭から計算し、負の値を渡すと末尾から計算しますので、これを覚えておいてください。

b_downの場合とa_downの条件を「または」という演算子を使っていることで、どちらの変数からも確認できるようにしています。(正直最初見たときは訳せなくて落ち込みました。)

追記(20201117)

コメントにてString.end_with?メソッドを教えていただきました。
前述の回答例よりも可読性が高いためこちらを追記します。

ruby
def compare(a, b)
  a_down = a.downcase
  b_down = b.downcase
  if b_down.end_with?(a_down) || a_down.end_with?(b_down)
    puts "True"
  else
    puts "False"
  end
end

なお、文字列の先頭が一致しているかを確認する場合はString.start_with?メソッドが使用できるようです。コメントを下さりありがとうございました!

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