はじめに
Rubyを勉強していて、値渡しと参照渡し、破壊的メソッドの関係について学んだのでメモ
学んだこと
以下のようなコードを書いていて想定していた動きと違ったので深掘りしてみた。
def remove_same_word(array , element)
array.delete(element)
array
end
words = ['hoge','hige']
word = 'hige'
p words
p remove_same_word(words , word)
p words
=> ["hoge", "hige"] # 元のwords
=> ["hoge"] # remove_same_wordの実行結果
=> ["hoge"] # remove_same_word後のwords
上記は第一引数の配列wordsから第二引数のwordと同じ名前の要素を取り除きその結果を変えすメソッドです。
メソッドに渡したwordsの値が変わらないと思っていたのですがそうではありませんでした。
なぜこうなったか、結論からいうと破壊的メソッドを使っていたからでした。
私の今までの認識では破壊的メソッドは「!」がつくと勘違いしており、引数に入れたオブジェクトの値は変わらないと思っていました。
今回の例で言うとremove_same_wordメソッドの中で使っているremoveがそれにあたり元の値までもが変更されていました。
参考