はじめに
Ruby初学者です。
本記事はRubyの破壊的メソッドと非破壊的メソッドを使ったときの挙動について、書いたものです。
破壊的メソッドと非破壊的メソッドの違い
結論からいうとオブジェクト自身の内容を変えてしまうものを破壊的メソッド、変わらないものを非破壊的メソッドと呼びます。
破壊的メソッドの実行例
破壊的メソッドupcase!
メソッドを使って実行結果を見てみましょう。
※ !のついたメソットは全て破壊的メソッドになります。しかし気をつけなければならないのは!がついていない破壊的メソッドもあるということです。
word = "abc"
word.upcase!
p word
=> ABC
破壊的メソッドはオブジェクト自身の内容を変えるのでword
が書き換えられているのがわかります。
非破壊的メソッドの実行例
非破壊的メソッドupcase
を使って実行結果を見てみます。
word = "abc"
word.upcase
p word
=> abc
上記のようにword
が変わっていないのがわかります。upcase
は大文字に変換したものを返り値として返すメソッドなので、word
を書き換えたい場合は次のようにします。
word = "abc"
word = word.upcase
p word
=> ABC
2つのオブジェクトの動き
.object_id
を使うとどのオブジェクトを参照しているか、見ることができます。
破壊的メソッドを使った場合と非破壊的メソッドを使った場合でどういう動きをするかを見てみます。
宣言時
word1 = "abc"
word2 = word1
p word1.object_id => 70316803929680
p word2.object_id => 70316803929680
上記を見てみると代入時は同じオブジェクトを見ていることがわかります。
1.破壊的メソッドの場合
破壊的メソッドを使った場合はどうなるでしょうか。
先ほどのupcase!
を使ってみてみましょう
word1 = "abc"
word2 = word1
word1.upcase!
p word1 => "ABC"
p word2 => "ABC"
p word1.object_id => 70316803929680
p word2.object_id => 70316803929680
word1
とword2
の値が変更されオブジェクトのIDが変わらないのがわかります。
これにより破壊的メソッドはオブジェクトの値そのものを変更するということが理解できます。
2.非破壊的メソッドの場合
破壊的メソッドを使った場合はどうなるかupcase
を使ってみましょう
word1 = "abc"
word2 = word1
word1 = word1.upcase
p word1 => "abc"
p word2 => "ABC"
p word1.object_id => 70316807663740 ←違うオブジェクトIDを見ている
p word2.object_id => 70316803929680
upcase
で置換後word1
が新しいオブジェクトを見ていることがわかります。
もう一方のword2
は代入時と同じオブジェクトIDとなっています。
まとめ
今回のポイントは以下になります。
- 破壊的メソッドは、オブジェクトの値そのものが変更される。(オブジェクトIDは同じ)
- 非破壊的メソッドは、新しいオブジェクトが生成されて値が変更される(オブジェクトIDは変わる)