Show page source of モジュール #51368

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