任意の文字に対してn番目の文字を消し、
その消した文字を出力するメソッドを作りましょう
呼び出し方
missing_char(string, num)
出力例:
missing_char('kitten', 1) → 'itten'
missing_char('kitten', 2) → 'ktten'
missing_char('kitten', 4) → 'kiten'
1・sliceメソッド
sliceメソッドを用いることで、配列や文字列から指定した要素を取り出すことができます。
文字列の要素を指定する際は数字を用い、先頭の文字列は0からカウントされます。
# 文字列を作成
string = "abcdefg"
# 文字列から引数で指定した要素を取得して変数に代入
str = string.slice(2)
# strに代入した文字列を出力
puts str
#=> "c"
# 文字列はもとのまま
puts string
#=> "abcdefg"
2・slice!メソッド
末尾にエクスクラメーションマーク(!)のつくメソッドを破壊的メソッドといいます。これはもとの配列や文字列を変化させるメソッドです。slice!メソッドを使用することで、指定した要素を削除することができます。
string = "abcdefg"
str = string.slice!(2)
puts str
#=> "c"
# "c"が取り除かれている
puts string
#=> "abdefg"
解答
def missing_char(str, n)
str.slice!(n - 1)
puts str
end
任意の文字に対してn番目の文字を消すために、文字列自体から取得した値を取り除く、slice!メソッドを使用。
しかしsliceメソッドは文字列自体の形を変化させることはできないため、エクスクラメーション(!)を付けたslice!メソッドに変更している。
このslice!メソッドはmissing_charメソッド内で処理を行い、
missing_charメソッドの引数strには入力した文字列で、nは何番目の文字列を消すのか指示する数字を入れる仕組み。
そして、slice!メソッドにnから1を引いた数を引数にしているが、なぜ1を引くのか?
文字列の順番を指定する際も、配列と同じように先頭の文字列は0からカウントされるため。
【文字列の順番】(人間
123
s t r
012
【添字の順番】(機械
人間から見た文字の順番は1〜
機械から見た文字の順番は0〜
人間→機械への翻訳なので「n - 1」って感じで理解できました。
奥が深い。