IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

RubyビギナーのためのStep upコラム

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第8回 Rubyのモジュールについて(3) (中越智哉) 2018年11月

みなさん、こんにちは。
今回は前々回、前回とご紹介していた「モジュール」についての続きです。

Rubyのモジュールには、主に3つの役割があるといえます。

① 共通に利用するAPI的な関数(モジュール関数)の提供
② 継承に代わってクラスに実装を提供
③ 名前空間の提供

このうち、①と②について前回まででご紹介しました。

今回は、③の名前空間の提供についても見てみましょう。

Rubyのモジュールはこれまで見てきた以外にも「名前空間の提供」という役割も持っています。「名前空間」という言葉は、知らない方にとってはなかなか謎めいた響きがあるかもしれないですね。

名前空間の例としては、例えば同じ会社に同姓の「中越さん」という社員が2人いた場合(実際、中越のようなマイナー名字の社員が同じ職場に2名いるというのはかなりレアだと思いますが、それはさておき)に、「中越さん」とただ言っただけではどちらの中越さんか区別できません。しかし、「総務部」の「中越さん」とか「営業部」の「中越さん」といえば区別できますよね。こういったものを「名前空間」と呼びます。他言語では「パッケージ」と呼ばれることもあります。

Rubyのモジュールは名前空間の提供の役割も持っているため、モジュール定義内にクラスやモジュールを定義することも可能です。

例えば、次のような記述ができます。

module  Foo
  class  Bar 
      def  hello 
          puts  "HELLO,FooBar!" 
      end 
  end 
end 

上記のようなモジュールによる名前空間を持つクラスにアクセスするには「モジュール名::クラス名」のように表記します。例えば、上記のBarクラスのインスタンスを生成してhelloメソッドを実行するには、次のように記述します。

Foo::Bar.new.hello

「::」という記述は、クラスやモジュールの定数へのアクセスにも利用されますよね。たとえば、「Math::PI」という記述はMathモジュールの定数PIへのアクセスですが、名前空間での参照にも同じ記号が使われるのです。Rubyでは大文字で始まる識別子は定数とみなされるというルールがあるため、クラス名、モジュール名も同じく大文字で始まる識別子ということで、このようなルールになっていると思われます。

名前空間を設定することによって、同じクラス名であっても区別して用いることができるようになります。次の例は、Testという同じ名称のクラスをFooモジュール、Barモジュールにそれぞれ定義していますが、利用時にはFoo::Test、Bar::Testのように区別して利用することができています。

module  Foo 
    class  Test 
        def  hello 
            puts  "Hello,FooTest!" 
        end 
    end 
end 

module Bar class Test def hello puts "Hello,BarTest!" end end end
Foo::Test.new.hello Bar::Test.new.hello

上記のコードの実行結果は次のようになります。

C:\rb>ruby module6.rb
Hello,FooTest!
Hello,BarTest!

また、名前空間は入れ子にして定義することで名前空間を階層化することも可能です。次のようにモジュールFoo内にモジュールBarを、モジュールBar内にクラスTestを定義すると、「Foo::Bar::Test」のように参照できます。

module  Foo 
    module  Bar 
        class  Test 
            def  hello 
                puts  "Hello,FooBarTest!" 
            end 
        end 
    end 
end 

Foo::Bar::Test.new.hello

もしかすると、Ruby on Railsのコードでよく目にする「ActionController::Base」や「ActiveRecord::Base」などが何を意味するのだろう?と思っていた方もいるかもしれないですね。実はこれらは名前空間の記述だったというわけです。

ということで、3回に分けてモジュールの使い方についてみてきました。次回もどうぞお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes