LoginSignup
2
1

More than 1 year has passed since last update.

[Ruby]破壊的メソッドと非破壊的メソッドを使ったときの挙動の違い

Posted at

はじめに

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

word1word2の値が変更されオブジェクトの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は変わる)
2
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
2
1