モジュール

概要

  • モジュールはクラスに組み込み、クラス機能の一部として再利用可能なコンポーネントです。
  • モジュールには、クラスと同様、データ変数とそれを操作するためのメソッドを定義することが可能です。
  • モジュールは単独では使用できません。必ず他のクラスに組み込んで使用します。
  • モジュールにはスーパークラスに相当するものはありません。

モジュールの定義方法

module モジュール名
  モジュールメソッド定義
  インスタンスメソッド定義
  モジュール変数定義
  インスタンス変数定義
end
  • モジュール宣言内のメソッド定義、変数定義の定義は順不同で記載できます。

モジュールの組み込み方法

  • モジュールをクラスに組み込むには、以下の構文を使用します。
    module MyModule
    	# モジュールが組み込まれたクラスのインスタンス変数、インスタンスメソッドに展開されます。
    	@mInstanceVariable = 1
    	def mInstanceMethod( )
    	end
    
    	# モジュールが組み込まれたクラスのクラス変数、クラスメソッドに展開されます。
    	@@moduleVariable = 2
    	def module.moduleMethod( )
    	end
    end
    
    class MyClass
    	import m = MyModule
    	using m
    end
    
  • スクリプトのコンパイラはこの定義を以下のように展開します。
    class MyClass
    	# import節により、MyModuleの内容が @m, @@m に代入される
    	MyModule @m
    		@mInstanceVariable = 1
    		def mInstanceMethod( )
    		end
    
    	MyModule @@m
    		@@moduleVariable = 2
    		def module.moduleMethod( )
    		end
    	
    	# using節による m の組み込み
    	@mInstanceVariable
    	def mInstanceMethod( )
    	end
    
    	@@moduleVariable = 0
    	def module.moduleMethod( )
    	end
    end
    
  • モジュールデータへのアクセスは、モジュール変数 m を使用してアクセスした場合も直接アクセスした場合も、同一のメモリアドレスを参照します。
    p = MyClass.new()
    Console.println( p.@m.@mInstanceVariable )  # => 1
    Console.println( p.@mInstanceVariable )     # => 1
    
    p.@mInstanceVariable = 2
    Console.println( p.@m.@mInstanceVariable )  # => 2
    Console.println( p.@mInstanceVariable )     # => 2
    
  • 複数のモジュールを using で取り込んだ際、名前の競合はコンパイルエラーとなります。
    module MyMoudle_1
      def method_1()
      end
    end
    module MyMoudle_2
      def method_1()
      end
    end
    
    class MyClass
      import m1 = MyModule_1
      import m2 = MyModule_2
      using m1
      using m2	# error:method_1 has already defined.
    end