皆さんはincludeやprependでモジュールを継承したことはありますか?
初心者であれば、あまり使ったことがあるという人はいないのではないでしょうか。
そうなると、includeとprependに関して理解している人も少ないと思います。
しかし、includeとprependには明確な違いがあります。
これは、皆さんがこれからRubyistとして活躍していきたいのであれば、是非理解していただきたい内容となっております。
簡単にわかりにくい内容を省いて解説しておりますので、是非ご一読ください!
そもそもincludeとprependって何ができるの?
includeとprependは、モジュールをクラスに継承するためものです。
予めモジュールに定義していたメソッドなどを引き継ぐことができます。
includeとprependの違いとは?
そして、本題なのですが、includeとprependの違いとはなんなのでしょうか。
答えは、継承チェーンにあります。
継承チェーンについては以前記事にしたので、わからない方は是非ご一読ください。
includeは読み込んだモジュールが、継承チェーンの中でクラスの上にくるという特性があります。
一方で、prependはクラスの下に位置します。
継承チェーンの位置関係が異なると、どんなことが起きるの?
継承チェーンの位置関係が異なると、どのようなことが起きるか。
一番に理解しなければいけないのは、rubyがメソッドを理解する手順にあります。
rubyはメソッドを理解する際に、カレントクラスをみてから、継承チェーンを一個ずつたどってメソッドを探していくと、以前継承チェーンに関する記事に記載しました。
ということは、例えば、カレントクラスとそのスーパークラスに同じなえのメソッドが存在し、そのメソッドが呼び出された時、どのようなことが起こるのでしょうか。
答えは、「カレントクラスのメソッドの方が呼び出される」です。
したのクラスから順番に調べられていくので、上に位置するクラスのメソッドは必然的に優先順位が低くなってしまいます。
なので、includeとprependをうまく使い分けることで、そういったことを操作してアルゴリズムを組むことができるのです。
まとめ
どうでしたでしょうか。
初心者の時はincludeやprependなど、最初はよく使わないことに対しての理解は疎かになってしまいがちだと思います。
曖昧に、「どちらもモジュールを読み込むためのもの」といった理解の仕方をしている人も多くいるでしょう。
しかし、今回解説したように、いくつも似たようなものがあっても、それぞれ明確な違いはあるものです。
includeとprependの違いに関しては、特に重要なことだと思ったので記事にさせていただきました。
最後までお読みいただいてありがとうございます!
また次回もあればよろしくお願いいたします!