ルビーのシルバー勉強中に盲点だったところが見つかりました。
それはdeleteメソッド
deleteメソッドの挙動について今回は記事をあげたいと思います。
まずdeleteメソッドはarray、string、hashそれぞれのクラスで使えるメソッドです。
Array
まずはarrayクラスのdeleteメソッドの動き
deleteメソッドは引数で与えた値が一致したものも全て削除します。
array = [1,2,3,4,5,1,2,3,4,5]
p array.delete(3)
3
p array
[1,2,4,5,1,2,4,5]
上記のようにdeleteメソッドを使ったタイミングで返ってくる値は削除する対象の値が返ってきます。
そして破壊メソッドなので3が削除されています。
私は、deleteメソッドは他stringやhashも動きそんなに変わらないだろうと思っていました。
そして、模擬問題をとているときに間違えてしまい、
あれ?となったのです。
それはstringのdeleteメソッドの問題でした。
#String
string = '1234512345'
p string.delete('3')
さてこのとき何が返ってくるか?
正解は
string = '1234512345'
p string.delete('3')
"12451245"
またもう一度stringを呼び出すとどうなるか?
string = '1234512345'
p string.delete('3')
"12451245"
p string
"1234512345"
というわけで破壊メソッドではないんですね!
もちろんdelete!で破壊メソッドとなります。
string = '1234512345'
p string.delete!('3')
"12451245"
p string
"12451245"
#Hash
それではhashクラスはどうなるか?
hash = {a: 1, b: 2, c: 3, d: 4, e: 5}
p hash.delete(:c)
3
p hash
{:a=>1, :b=>2, :d=>4, :e=>5}
という動きをします。
返ってくるのは削除したkeyに対応するvalueです。
また破壊メソッドなので指定した引数が削除されています。
というわけでdeleteメソッドでした。