Ruby

【メソッド】破壊的メソッド(!)と非破壊的メソッドの違いを解説!

どうも、バートリーのさいとうです。

今回は、破壊的メソッドについてお話していこうと思います。

破壊的メソッドとは?というところから、普通のメソッドとは何が違うの?というところまで掘り下げ、なるべく分かりやすく解説していきます。

想定読者

  • rails学習者(実務未経験〜実務経験浅めの方)
  • 破壊的メソッドについて、理解し直したい人

それではいきましょう!

破壊的メソッドとは?

破壊的メソッドは、以下のように
!“(エクスクラメーションマーク)をつけたメソッドのことを指します。

upcase!(文字列を大文字にするメソッド)
update!(更新を行うメソッド)

とても簡単ですね。

破壊的メソッドと、非破壊的メソッドの違い

対して、”!”がつかないメソッドのことを相対的に、非破壊的メソッドと呼びます。

この二つの違いはなんでしょうか?

結論

  • 破壊的メソッド:元々(オリジナル)の値を変更する(参照渡し)
  • 非破壊的メソッド:コピーした値を変更する(値渡し)

という違いがあります。

ここから、具体例をあげて説明していきます。

注)参照渡しと値渡しに関しては、補足の部分に参考記事を添付しています。

具体例

具体例として、先ほども登場したupcaseメソッドを利用していきます。

“japan”という文字列を大文字にしてみましょう。

まずは、破壊的メソッドから

country = "japan"
country.upcase!
p country
#出力結果→"JAPAN"

次に非破壊的メソッド

country = "japan"
country.upcase
p country
#出力結果→"japan"

違いに気づけたでしょうか?同じ処理ですが、出力結果が異なっていますね。

ポイント

3行目で出力したcountryは、両方とも1行目のcountryである

  • !がついた破壊的メソッドを利用した場合、1行目のcountryに代入されている”japan”(オリジナル)を変更した
    →出力結果は大文字になった
  • 対して、非破壊的メソッドは、1行目のcountryをコピーして2行目の処理を行った
    →コピーして変更した値がcountryに代入されなかった為、結果として1行目の値が、そのまま3行目で出力された。

というわけです。

ちなみに、非破壊的メソッドで、二行目の処理を反映させたい場合は

country = "japan"
country = country.upcase
p country
#出力結果→"JAPAN"

と、二行目でcountryに再代入を行うことで、大文字に変更することができます。

補足

ここまで、破壊的メソッドを非破壊的メソッドと比較しながら解説してきました。

最後に、3点補足です。

1点目は、破壊的メソッドは、全てのメソッドに存在するわけではないということです。

つまり、「どのメソッドにも”!”をつけていいというわけではない」、ということですね。

2点目は、これは値渡し、参照渡しという概念を理解できるとよりスッと腑に落ちるだろうと思います。

値渡しと参照渡しについては、こちらの記事が死ぬほど分かりやすいので参照ください。

最後3つ目に、!がついていないのに破壊的メソッドのような働きをするメソッドも存在するようです。詳しくは、こちらの記事を参照ください。

まとめ

  • メソッドには、破壊的メソッドと呼ばれる元々の値を変更するメソッドが存在する。
  • 相対的に、コピーして変更するのは非破壊的メソッドと呼ばれる。

このように、週に1回~2回、Ruby, Ruby on Railsを中心に技術ブログを更新しています。

もし参考になったなと思ったら、ブックマークをお願い致します。

最後まで読んでいただき、ありがとうございました!

それでは。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA