「a = "abc"」,「b = "HiAbc"」という二つの変数がある時、a,bいずれかの文字列がもう片方の文字列の最後にある場合にTrueを返すプログラムの作成方法です。
今回の場合、aのabcがbの後ろ三文字に存在するためTrueとなります。
以下二つのメソッドを使用することで作成することができます。
メソッドの使用例
- 大文字を小文字に変換するためにはdowncaseメソッド
a = "AbC"
a_down = a.downcase
// これにより a_down には abc が入る
- 特定の位置にある文字列などを切り抜きたい場合はsliceメソッド
a = "AbC"
a_slice = a.slice(1)
// これにより a_slice には b が入る
回答例
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行目でこの後に使用する変数の定義をしています。
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文で判定しています。
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?
メソッドを教えていただきました。
前述の回答例よりも可読性が高いためこちらを追記します。
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?
メソッドが使用できるようです。コメントを下さりありがとうございました!