見出し画像

要件を満たすメソッドの定義

2つの文字列の末尾の文字を比較して、一致する場合はTrue、一致しない場合はFalseを出力するプログラムを実装する。


【実装の要件】
・メソッドの引数に、任意の2つの文字列を指定する。
・引数に指定された2つの文字列のうち、どちらかがもう一方の文字列の末尾にある場合は、Trueを出力する
・上記を満たせていない場合は、Falseを出力する
・入力された文字が大文字でも小文字でも、同一の文字として処理を行う

【メソッドの呼び出しと出力の例】
 メソッド名('Hiabc', 'abc') → True
 メソッド名('AbC', 'HiaBc') → True
 メソッド名('abc', 'HaIoBc') → False

理解できていなかった点


 与えられる引数に関して、一方にのみに条件式を当てはめて結果を出力しようとしてしまった。どちらか一方の文字列の末尾に、もう一方の文字列が含まれるかを判断する場合は、演算子or'| |'で条件を指定し双方で条件に当てはまるか判断する必要がある。

実装の流れ


メソッドの引数である文字列aと文字列bについて、downcaseメソッドで大文字を小文字に変換し、変数a_downとb_downに代入する。

a_down = a.downcase
b_down = b.downcase

文字列a_downと文字列b_downについて、lengthメソッドで文字列の文字数を返し、変数a_lenとb_lenに代入する。

a_len = a_down.length
b_len = b_down.length

文字列a_downとb_downに対して、sliceメソッドで文字を切り取る範囲を変数a_lenとb_lenを利用し指定しする。a_downとb_downから切り取った要素のうち、どちらかがもう一方の文字列の末尾にある場合はTrue、それ以外はFalseを表示する条件分岐を定義する。

if b_down.slice(-(a_len)..- 1) == a_down || a_down.slice(-(b_len)..- 1) == b_down
  puts "True"
else
  puts "False"
end
#メソッド名をend_otherとした場合
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

# 呼び出し例
end_other('Hiabc', 'abc') 

上記の例でend_otherメソッドが呼び出された場合の条件式を考察します。

a_down = 'hiabc' - ①
b_down = 'abc' - ①
a_len = 5 - ②
b_len = 3 - ②

#条件式の左辺
b_down.slice(-(a_len)..- 1) → b_down.slice(-5..-1)
#b_down = 'abc'のため指定した範囲で切り取れないので b_down.slice(-5..-1) = nil
 nil == a_down は成立しないのでfalse

#条件式の右辺
a_down.slice(-(b_len)..- 1) → a_down.slice(-3..- 1)
#a_down = 'hiabc'のため指定した範囲で切り取ると a_down = 'abc'
  b_down = 'abc'のため  a_down = b_downとなるのでture

#右辺でif文の条件式がtrueとなるので"True"が出力される

 ①と②で文字を小文字に揃えて文字数を取得した後、条件式に値を利用します。どちらか一方の文字列の末尾にもう一方の文字列が含まれていれば良いので、演算式or '| |' で条件を指定します。