4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Ruby】RubyのAPI問題

Posted at

任意の文字に対して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」って感じで理解できました。
奥が深い。

4
1
0

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?