Rubyには、「include」と「include?」とがあるのをご存じでしょうか。include?について検索したのに、全然関係ない内容が表示されて困惑した経験がある方もいるかもしれません。この「include」と「include?」は、全く別の機能です。そして、それぞれどんな機能か知っていれば、その機能についての使い方を検索できます。そこで、今回はRubyで使えるincludeを含む2つの機能について解説します。
Rubyにはincludeとinckude?とがある
「include」は、Ruby以外のプログラムでもよく見かける機能です。特にC言語のプログラムを学んだ方にとってはおなじみの機能でしょう。
しかし、Rubyには、includeを使った機能として、モジュールを使えるようにする「include」と、文字列の検索メソッドである「include?」の2つの機能があります。次から、この2つの機能の概要についてご紹介します。
includeの意味
元々「include」は、「含む」や「含める」という意味の英語の動詞です。そして、プログラム言語の多くが「include」を採用しており、別のファイルに記述されたソースコードを追加する機能として使われています。
例えばC言語では、別ファイルとして用意されたライブラリを利用する際に必要なヘッダファイルを読み込むために、プログラムの先頭に「#include 」と記述します。これは、標準インクルードライブラリにある「stdio.h」に書かれたソースコードをプログラムに含めるという機能として使われます。
しかし、Rubyでは、C言語など他のプログラム言語の機能とは違う機能としてincludeが採用されています。英語の意味としては合っているので、間違えないようにしましょう。
includeはモジュールに対して使う
Rubyにおけるincludeの1つ目は、モジュールに対して使う機能です。なお、オブジェクト指向プログラム言語のRubyでは、クラスに変数と処理を記述して利用するのが一般的ですが、モジュールという機能も利用できます。なお、モジュールとは処理を外部に記述する機能です。そして、クラスを利用するためにnewでインスタンス化しますが、モジュールの場合はincludeを使用します。
include?は文字列の検索
Rubyにおけるincludeの2つ目は、文字列に対する検索機能です。これは「include」に「?」の付いた「include?」が該当し、文字列の中に検索したい文字列を含むかをチェックし、trueまたはfalseを返します。
なお、他のプログラム言語では、indexやstrstrといった関数名が使われていますが、Rubyの「include?」は英語の「含む?」という意味のため、文字列検索をより解りやすく書けると言えるでしょう。
文字列を検索する「include?」の使い方は、モジュールを参照する「include」の次にご紹介します。
モジュールを使うために使うinclude
まずは、モジュールに登録したメソッドを使えるようにする、「include」について解説します。なお、先ほども簡単に説明しましたが、Rubyにおけるモジュールは、メソッドだけを別に記述できる機能です。includeは、そのように別に書いたメソッドを使うために使用します。次から、includeで使用するモジュールについて詳しく解説します。
Rubyにおける外部参照の仕組み
オブジェクト指向のプログラム言語として開発されたRubyでは、他のプログラム用に作られたメソッドや変数を、新しく作るプログラムでも利用しやすいように作られています。そのため、外部のファイルに用意したメソッドや変数を利用し、それを利用するのが一般的です。
このような外部のファイルにメソッドを記述する機能がクラスとモジュールです。そして、外部のファイルを取り込む機能がrequireです。ただし、クラスやモジュールをプログラムに取り込んだとしても、その関数が無条件に使える訳ではありません。クラスではnewでインスタンス化しなければならず、また、モジュールを利用する方法は幾つかありますが、大抵はincludeでクラスの一部として取り込んで使用します。
モジュールの役割とクラスとの関係
Rubyの文法を学んだ方であれば、クラスの役割や機能、使い方などはもちろんご存じでしょう。そして、クラスにメソッドを書いた経験もあるのではないでしょうか。その場合、他の
クラスで書いたメソッドと同じメソッドを書いた経験はありませんか。モジュールを使えば
そういったメソッドを共通化できます。
このようにモジュールの役割は、クラス内で使われるメソッドの再利用性を高めることです。そして、クラス内で、モジュールに記述されたメソッドを有効にするためにincludeが使われます。
includeの使い方
モジュールの書き方は基本的にクラスと同じで、まずモジュールを定義し、その中にメソッドを記述します。
モジュールの書き方の基本
module モジュール名
def メソッド名()
メソッドの機能
end
end
そして、クラスの中でincludeでモジュール名を指定し、モジュールに記載されたメソッドをクラスに取り込みます。
クラス内でモジュールを使う方法
class クラス名
include モジュール名
end
次に、includeを使い、クラス内でモジュールを使用した例を紹介します。
例 module Mod def hello print("hello") end end class Cls include Mod end obj = Cls.new obj.hello
文字列を検索するinclude?
Rubyで「include」を使った機能のもう一つが、文字列を検索する「include?」です。次から、「include?」の使い方について解説します。
include?の基本的な使い方
長い文字列の中に、特定のキーワードが含まれているかをチェックする機能は、実際のプログラムでもよく使われます。そして、オブジェクト指向プログラム言語のRubyでは、文字列はオブジェクトとして扱うので、include?はオブジェクトの中から検索対象の文字列を検索するメソッドと定義されています。
include?の基本的な使い方
オブジェクト.include?(検索文字列)
なお、include?の戻り値は、引数が含まれていればtrueであり、含まれていなければfalseです。そのため、if文などに組み合わせて、条件分岐の方法として使われます。
include?の例 strs = "AAA BBB CCC" if( strs.include?(AAA) ) then print("AAAを含む\n") end
include?は配列にも使える
先ほどinclude?が対象とするのはオブジェクトと説明しましたが、そのおかげで他のプログラム言語と違い、検索文字に文字列以外のものを指定できます。そして、よくinclude?で検索文字に使われるのが配列です。具体的には次の例を参考にしてください。
配列に含まれるかを検索する例 arrs = ["AAA", "BBB", "CCC"] if( arrs.include?("AAA") ) then print("AAAを含む\n") end
なお、上記とは逆の使い方、つまり、配列に検索文字が含まれていない場合に処理するケースでは、include?の代わりにexclude?を使います。
配列に含まれないかを検索する例 arrs = ["AAA", "BBB", "CCC"] unless( arrs.exclude?("DDD") ) then print("DDDを含まない\n") end
include?の応用例
これまで解説したように、Rubyの文字検索は配列も使えて便利ですが、検索文字列に正規表現を直接書くことはできません。しかし、使い方によっては特殊な検索方法も可能です。
例えば、大文字小文字を区別せずに検索したいケースもあるでしょう。そのようなケースでは、検索対象の文字列と検索文字を小文字に変換してinclude?を実行することで、大文字小文字を区別せずに検索できます。
大文字小文字を区別せずに検索する例 strs = "AAa BbB ccC dDd" key = "AAA" if( strsdowncase..include?(key.downcase) ) then print("AAAを含む\n") end
また、include?の対象は文字列や配列だけではありません。日付もオブジェクトであり、配列のように期間のオブジェクトも作れます。そして、これを活用すれば、予定日が期間に含まれるかどうかをチェックする処理も、include?で作れます。
日付のチェックの例 require 'date' daterange = (Date.parse("2019-07-15")..Date.parse("2019-09-15")) targetday = Date.parse("2019-08-03") if( daterange.include?(targetday) ) then print("期間内です\n") end
rubyにはincludeの機能は2つある
GoogleなどでRubyのincludeを検索すると、探しているのと違う記事がヒットする、と感じた方は疑問が解消されたでしょうか。Rubyには、モジュールを使えるようにする「include」と、文字列の検索メソッドである「include?」と、incliudeを使った機能が2つあります。どちらの機能も正しく理解して、Rubyの「include」を使いこなせるようになりましょう。