スポンサーリンク

【Ruby】破壊的メソッドとは??非破壊的メソッドとの違いをまとめてみた!!

みなさんこんにちは!
のむ(@nomu_engineer)です!

今回の記事では、破壊的メソッドについてまとめました!
破壊的メソッドについての理解が乏しい方は是非読んでみてください!

この記事を読むメリット
・破壊的メソッド
とは何かを知ることができる
・破壊的メソッドと非破壊的メソッドの違いについて知ることができる

この記事を読むおすすめの読者
・プログラミング初心者
・駆け出しエンジニア
・破壊的メソッドについての理解を深めたい方

それでは早速本題の方に入っていきたいと思います

破壊的メソッドとは??

「破壊的メソッド」という名前だけ聞くと、何かを破壊するのか?のようなイメージを持つ方が多いのではないでしょうか。

あながち間違いではないです。

破壊的メソッドとは、レシーバであるオブジェクトそのものに変更するメソッドのことです。
これに対して、実行結果のみに影響するメソッドのことを非破壊的メソッドと言います。

詰まるところどういうことかというと、破壊的メソッドは元の値を変更させるメソッドということになります。

実際にコードをみてもらった方がわかりやすいと思うので、下記の2種類のコードを見てください!

まずは、破壊的メソッドの場合のコードです。

array = ["りんご","みかん","イチゴ"]

array.slice!(1)
=>["みかん"]

puts array
=> ["りんご","イチゴ"]

上記のコードを見ていただくとわかると思うのですが、破壊的メソッドを使って、配列の中身を取得した場合、元の値である、arrayからみかんという要素が消えていると思います。

これが、元の値に変更を加えるということです。

次に非破壊的メソッドについてのコードです。

array = ["りんご","みかん","イチゴ"]

array.slice(1)
=>["みかん"]

puts array
=> ["りんご","みかん","イチゴ"]

上記のコードを見ていただくとわかると思いますが、arrayオブジェクトの配列からみかんという要素を取り出していますが、基のarrayオブジェクトのにはみかんという要素が残ったままになります。

このように、その場の実行結果のみに影響するのが非破壊的メソッドとなります。

sliceメソッドについてもうちょっと知りたいという方は、こちらの記事を参考にしてみてください!
sliceメソッドについての記事

sliceメソッドは非破壊的メソッドでもslice!メソッドは破壊的メソッドになります。

同じ機能のメソッドでも、語尾に「!」をつけることで、非破壊的メソッドから、破壊的メソッドに変わるということです

プログラミングの学習を初めて日が浅い方は、非破壊的メソッドと破壊的メソッドの違いは「!」がついているか否かで見極めている方が多いと思いますが、「!」がつかない破壊的メソッドもあるので注意してください!

「!」がつかない破壊的メソッド

「!」がつかない破壊的メソッドの例を最後に1個紹介して終わりたい思います。

Rubyを学習して一番最初に学びそうな破壊的メソッドを例にすると、Arrayクラスの「<<」メソッドが典型的な破壊的メソッドかなと思います。

「あ、そう言われてみたらこれも破壊的メソッドに入るね」と思った方も少なくはないはずです。
僕も思いましたから。笑

この「<<」メソッドはArrayクラスが持つメソッドで、配列の末尾に引数で指定し要素を追加します。

array = ["りんご","みかん","イチゴ",]
array << "ぶどう"
puts array
=> ["りんご","みかん","イチゴ","ぶどう"]

このように基のarrayオブジェクトの値が変更しているのがわかります。
なので「<<」メソッドも破壊的メソッドの一つなのです。

最後に

最後に今回の記事の内容をまとめて終わりたいと思います。

①破壊的メソッド
 ・・・レシーバであるオブジェクトそのものに変更を加えるメソッドのこと

②同じ機能のメソッドでも語尾に「!」をの有無で破壊的メソッドにも非破壊的メソッドにもなるということ

③語尾に「!」がつかない破壊的メソッドも存在するというこ

これからRubyの学習を進めて上では知っておきたいことなので、是非抑えておきましょう!

ありがとうございました!

スポンサーリンク




この記事を書いた人