こんにちは!エンジニアのかい@dikxs118です。
今日はRubyのincludeについて見ていってもらえたらと思います。
プログラム初心者の方がまずつまづくところが、クラス、モジュールの概念だったり、このincludeの概念だったりします。
ここでしっかり分かっておくか置かないかで今後大きく変わっていきます。
そのため、まだ分かってない方はしっかり勉強していきましょう。
今日は、
・includeとは
ということをメインに
・クラスとはなにか
・モジュールとはなにか
・includeとrequireの違い
という部分をしっかりと説明していきます。
includeとは
そもそもincludeとはどのようなものなのでしょうか。
includeはモジュールの性質を他のクラスに追加するために使用されるメソッドとなります。
言い換えるならばincludeはモジュールをよぶためのメソッドです。
includeは以下のように記述します。
include モジュール名
では実際にincludeを使ってみましょう。
module Sayhello def hello p 'hello' end end class Sayhello_2 include Sayhello end a = Sayhello_2.new a.hello
“hello"
このように、定義したモジュールをクラスの中でincludeすると、インスタンスを立てることができます。
クラスやモジュールについての理解がないとincludeを理解することはできません。
そのため、次項では簡単にクラスとモジュールについても説明しておきます。
クラスとモジュールの違い
基本的にどちらもひとかたまりのデータをまとめたものなのですが、大きな違いはいかの2つです。
・どうやって継承させるか
・インスタンスを立てることができるか
他にも細かい違いやモジュールは名前空間を作れたりとあるのですが、本題ではないのでここでは説明しません。
モジュールについて詳しく知りたい方は以下の記事を読んでみてください。
クラスについて詳しく知りたい方はこちらの記事が参考になるでしょう。
では、違いを一つずつ見ていきましょう。
どうやって継承させるか
親クラスの機能を子に受け継がせることのできるのが「継承」ですが、クラスでは一つの親のみしか継承することができません。
そのため、クラスの継承は単一継承と言われています。
対して、モジュールは厳密には継承ではないのですが、Mixinという技術を用いて多重継承を可能としています。
モジュールでは継承できないという文献をよく見かけますが厳密に言えば正しいのですが、Mixinを用いて継承のようなことを複数できるため、そこまで厳密に考える必要はないでしょう。
簡単にお互いの使い方を見てみましょう。
クラスを継承してみよう!
ではクラスを継承してみます。
継承するときは<に続けてスーパークラス(親クラス)を定義します。
class Sayhello def hello p "hello_1" end end class Sayhello_2< Sayhello def hello_2 p "hello_2" end end a = Sayhello_2.new a.hello a.hello_2
"hello_1" "hello_2"
はい、Sayhello_2のインスタンスを立てたにもかかわらずそのインスタンスでhello_2を呼び出せていますね。
これが継承です。
クラスなので一つしか継承出来ません。
モジュールでMixinしてみよう!
では次は、モジュールの多重継承の例を見てみましょう。
モジュールの継承のさせかた(正しくはMixinという)は主にクラス内に呼び込むと言う形で使います。
どうやって呼び込むかというと、includeをつかって呼び込みます。
つまりイメージとしては、includeを使ってモジュールをクラス内に呼び込むということで多重継承を可能としています。
最初でもやった通りにですが実際にもう一度やってみましょう。
module Say def say p "say" end end module Hello def hello p 'hello' end end class Sayhello include Say include Hello end a = Sayhello.new a.say a.hello
"say" "hello"
はい、SayとHelloのモジュールを2つSayhelloのクラスの中で呼び出すことができましたね。
ここまでで、クラスとモジュールの違い、includeの使い方は大分わかったのではないでしょうか?
次はクラスとモジュールの違いである、インスタンスを宣言できるかどうかというところもサラッと見てみましょう。
モジュールではインスタンスは立てられない!
これも大したことではないのですが、一番最初のコードを見てみましょう。
module Sayhello def hello p 'hello' end end class Sayhello_2 include Sayhello end a = Sayhello_2.new a.hello
これにモジュールでもインスタンスを立てようとしてみると、
module Sayhello def hello p 'hello' end end class Sayhello_2 include Sayhello end a = Sayhello_2.new a.hello b = Sayhello.new #moduleはインスタンス立てられない
test.rb:14:in `<main>': undefined method `new' for Sayhello:Module (NoMethodError)
という風にエラーになります。
なのでモジュールはきちんとクラスの中でincludeするようにしましょう。
includeとrequireの違い
最後に時々Rubyのrequireとincludeが混ざってしまう人がいるようですが、この2つは全くの別物です。
・requireは外部ファイルやライブラリを読み込むのに使う
・includeはモジュールをクラス内で呼ぶために使う
と全く違うのでこの2つは似てる?とか思っている人はその違いしっかりと理解しておいてください。
また、requireについて詳しく知りたい方はこちらの記事を参考にしてください。
まとめ
いかがでしたでしょうか?
しっかりと、クラス、モジュール、includeについて理解できたでしょうか?
・クラスは単一継承しかできず>をつかってスーパークラスを指定する
・モジュールはincludeをつかってクラスの中で継承する(複数可)
ということをしっかりと覚えておきましょう。
モジュールには多重継承以外にも便利な使い方があるので学んでおくと良いでしょう。
概念的に初学者が躓きやすいところですので必ず手を動かして理解に努めてみてください!それでは!!