はじめに
今回はsliceメソッドを使用するお話です
破壊的メソッドにも触れます
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです
目次
- "slice"メソッドについて
- []について
- 破壊的メソッドについて
- 問題
- 破壊的メソッドを使わない様に書いてみる
"slice"メソッドについて
こちらによると「sliceメソッドは、[]の別名です。引数にしたがって文字列の中から部分文字列を取り出します。」とあります
引数に整数一つを指定すると、その一文字を取り出す事ができます *Ruby1.9以降
少し使ってみます
array = "school"
p array.slice(0)
=> "s"
0番目の一文字を取り出せました
元の変数には変化がありません
array = "school"
p array.slice(0)
p array
=> "s"
=> "school"
[]について
silceメソッドの別名というだけあって、使い方は同じです
array = "school"
p array[0]
=> "s"
0番目の一文字を取り出せました
同じく元の変数には変化がありません
array = "school"
p array[0]
p array
=> "s"
=> "school"
記述的にはシンプルなので、こちらを使うほうが良さそうですね
破壊的メソッドについて
破壊的メソッドとは、実行した時に元となったのオブジェクト自身の内容を変更してしまうメソッドのことです。
基本的には、メソッドの最後に"!"がつきます
先ほどの配列"array"でやってみましょう
array = "school"
p array.slice!(0)
=> "s"
ここまでは同じです
しかし、元の配列の中身を示すとこうなります
array = "school"
p array.slice!(0)
p array
=> "s"
=> "chool"
"s"が取り出されたことにより、元の配列から"s"が消えてしまいました
この様に、元のオブジェクトの値自体を変更してしまうメソッドのことを破壊的メソッドと呼びます
問題
私の通っているスクールで、この様な問題が出ました
同じだと問題があるので、少し変えます
array('Ruby') => 'byRu'
array('python') => 'thonpy'
array('Hi') => 'Hi'
配列"array"に対して、「最初から2文字を最後尾に持ってくるメソッドを作ろう」という問題です
先ほどの"slice"メソッドと、破壊的メソッドを使用すれば、簡単に答えを導く事ができます
前提知識として、slice(0,2)とすれば、「前から数て"0"番目から"2"文字分を取り出す」という意味になることが必要です
def array(str)
array = str.slice!(0,2)
new_array = str + array
return new_array
end
p "文字を入力してください"
input = gets.chomp
p array(input)
"input"のなかに好きな文字を入れれば最初から2文字を最後尾に持ってくる事が可能です
しかし、問題は破壊的メソッドを使用しているという点です
破壊的メソッドに関して、何名かのご意見を拝見いたしましたが、初学者の私にとってどうすべきかの判断は付けづらかったので、状況によっては使って良いという解釈で行きたいと思います。
使わないほうがいいと思った理由の一つには、元のオブジェクトの中身を変えてしまうので、自分以外の人がメンテナンスをする際に辿るのが大変な事があげられます。
使ってもいいシチュエーションがあるなと感じた理由の一つには、配列オブジェクトに対してハッシュオブジェクトを格納していく際、"<<"メソッドを使用します(これも破壊的メソッドです)が、そういった場合は使ってもいいのではないかなあと思います。今の私では、それ以外で配列にハッシュオブジェクトを格納する方法を知らないということもありますが…
破壊的メソッドを使わない様に書いてみる
では、先ほどの問題を、破壊的メソッドを使わずに解いてみましょう
といっても、最初から2文字を取り出せているので、そこまで難しくはありません。
前提知識として、「数値をマイナスにすると後ろから数えて何番目を指定する」ということくらいです
def array(str)
array = str.slice(0,2)
length = str.length
back = str.slice(2-length,length-2)
new_array = back + array
return new_array
end
p "文字を入力してください"
input = gets.chomp
p array(input)
こんな感じですね
ポイントは"(2-length,length-2)"のところでしょうか
入力される文字列が何文字か決まっていないので、"2-length"とすることで、後ろから3番目を必ず指定できます
今回は最初から2文字と決まっているので、2から引きましたが、これも何文字までと指定する様に変えてあげれば汎用性(あるのか?)が増えますね
今回はこれで以上です