パッケージによる名前空間の作成
パッケージ フォルダー
パッケージは、クラス フォルダーや、関数ファイルとクラス定義ファイル、その他のパッケージを含むことができる特別なフォルダーです。クラスおよび関数の名前はパッケージ フォルダーのスコープをもちます。パッケージは、名前が一意でなければならない名前空間です。関数名とクラス名はパッケージ内に限り一意でなければなりません。パッケージを使用することにより、クラスと関数を整理する手段が提供されます。また、パッケージ化することで、クラスと関数の名前を他のパッケージで再使用できるようにもなります。
メモ
パッケージは、MATLAB® Version 7.6 よりも前に作成されたクラス (つまり、classdef
を使用しないクラス) ではサポートされません。
パッケージ フォルダーは常に +
文字で始まります。次に例を示します。
+mypack +mypack/pkfcn.m % a package function +mypack/@myClass % class folder in a package
最上位のパッケージ フォルダーの親フォルダーは、MATLAB パス上になければなりません。
パッケージの内容の一覧表示
パッケージの内容を一覧表示するには、以下のように help
コマンドを実行します。
help event
Contents of event: EventData - event.EVENTDATA Base class for event data PropertyEvent - event.PROPERTYEVENT Event data for object property events listener - event.LISTENER Listener object proplistener - event.PROPLISTENER Listener object for property events
what
コマンドを使うこともできます。
what event
Classes in directory Y:xxx\matlab\toolbox\matlab\lang\+event EventData PropertyEvent listener proplistener
内部パッケージ
MathWorks® では、MATLAB の内部コードで使用されるユーティリティ関数用に internal
という名前の付いたパッケージの使用権を留保しています。internal
パッケージに属する関数は MathWorks 専用のものです。internal
パッケージに属する関数またはクラスの使用は推奨されません。新しいソフトウェアがリリースされると、前のリリースで使用していた関数やクラスが同じように動作しなくなる可能性があります。MATLAB ソフトウェアの今後のリリースでは、これらの関数やクラスが予告なく削除され、製品のリリース ノートにその旨が記載されない可能性があります。
パッケージのパッケージ メンバーの参照
パッケージ内のパッケージ、関数、クラスに対するすべての参照は、パッケージをインポートしない場合には、パッケージの名前の接頭辞を使用する必要があります (クラスのインポートを参照)。たとえば、次のパッケージ関数を呼び出します。
+mypack/pkfcn.m
次の構文を使用します。
z = mypack.pkfcn(x,y);
定義ではパッケージの接頭辞を使用しません。たとえば、関数 pkfcn.m
の関数定義行には、関数名のみが含まれます。
function z = pkfcn(x,y)
クラス名だけでパッケージ クラスを定義します。
classdef myClass
ただし、これをパッケージの接頭辞で呼び出します。
obj = mypack.myClass(arg1,arg2,...);
ユーザーはクラスのオブジェクトをもっているので、クラス メソッドを呼び出すときにパッケージ名を必要としません。ドット表記または関数表記を使用できます。
obj.myMethod(arg) myMethod(obj,arg)
静的メソッドは、パッケージ名を含む完全クラス名を必要とします。
mypack.myClass.stMethod(arg)
パッケージ外からのパッケージ メンバーの参照
あるパッケージに含まれる関数、クラスおよびその他のパッケージは、そのパッケージをスコープとします。パッケージ メンバーのいずれかを参照するには、メンバー名の前にパッケージ名を置き、その間をドットで区切ります。たとえば、次のステートメントは、mypack
パッケージに含まれる MyClass
のインスタンスを作成します。
obj = mypack.MyClass;
クラス メンバーへのアクセス — さまざまな方法
この節では、パッケージの外からさまざまなパッケージ メンバーにアクセスする方法について説明します。以下の内容をもつパッケージ mypack
があるとします。
+mypack +mypack/myFcn.m +mypack/@MyFirstClass +mypack/@MyFirstClass/myFcn.m +mypack/@MyFirstClass/otherFcn.m +mypack/@MyFirstClass/MyFirstClass.m +mypack/@MySecondClass +mypack/@MySecondClass/MySecondClass.m +mypack/+mysubpack +mypack/+mysubpack/myFcn.m
mypack
の関数 myFcn
を呼び出します。
mypack.myFcn(arg)
mypack
の各クラスのインスタンスを作成します。
obj1 = mypack.MyFirstClass; obj2 = mypack.MySecondClass(arg);
パッケージ mysubpack
の関数 myFcn
を呼び出します。
mypack.mysubpack.myFcn(arg1,arg2);
mypack.MyFirstClass
が myFcn
と呼ばれるメソッドをもつ場合、オブジェクトを呼び出すメソッドと同様にして呼び出します。
obj = mypack.MyFirstClass; myFcn(obj,arg);
mypack.MyFirstClass
が MyProp
と呼ばれるプロパティをもつ場合、ドット表記とオブジェクトを使用して割り当てます。
obj = mypack.MyFirstClass; obj.MyProp = x;
パッケージと MATLAB パス
MATLAB パスにパッケージ フォルダーを追加することはできません。ただし、パッケージの親フォルダーを MATLAB パスに追加しなければなりません。MATLAB パス上にパッケージの親フォルダーがない場合、パッケージ フォルダーが現在のフォルダーである場合でもパッケージのメンバーにアクセスできません。パッケージの親フォルダーをパスに追加するには、パッケージ フォルダーを現在のフォルダーにするだけでは不十分です。
パッケージのメンバーのスコープはパッケージ内のままです。常にパッケージ名を使用してパッケージのメンバーを参照する必要があります。あるいは、パッケージ メンバーを呼び出すことができる関数にパッケージをインポートします。クラスのインポートを参照してください。
パッケージ フォルダーはクラスとは異なり、パス上で後方に位置する他のパッケージ フォルダーを隠すことはありません。2 つ以上のパッケージが同じ名前である場合、MATLAB はそれらすべてを 1 つのパッケージとして扱います。異なるパス フォルダーにある、名前の重複するパッケージで同じ関数名が定義されている場合、MATLAB はそのうちの 1 つの関数しか検出しません。
重複する名前の解決
パッケージとクラスが同じ名前をもつと仮定します。次に例を示します。
fldr_1/+foo fldr_2/@foo/foo.m
which foo
への呼び出しでは、実行可能なクラス コンストラクターへのパスが返されます。
>> which foo fldr_2/@foo/foo.m
関数とパッケージは、同じ名前をもつことができます。ただし、パッケージ名は、それだけでは識別子になりません。そのため、重複する名前だけがある場合、関数を識別します。パッケージの名前のみを実行すると、エラーになります。
パッケージ関数と静的メソッド
パッケージとクラスが同じ名前をもつ場合、パッケージ関数は、静的メソッドに優先します。たとえば、パス フォルダー fldrA
にパッケージ関数が含まれ、パス フォルダー fldrB
にクラスの静的メソッドが含まれているとします。
fldrA/+foo/bar.m % bar is a function in package foo fldrB/@foo/bar.m % bar is a static method of class foo
which foo.bar
の呼び出しは、パッケージ関数のパスを返します。
which foo.bar
fldrA\+foo\bar.m % package function
同じパス フォルダーに、同じ名前のパッケージとクラス フォルダーが含まれている場合は、パッケージ関数が静的メソッドに優先します。
fldr/@foo/bar.m % bar is a static method of class foo fldr/+foo/bar.m % bar is a function in package foo
which foo.bar
の呼び出しは、パッケージ関数のパスを返します。
which foo.bar
fldr/+foo/bar.m
パス フォルダー fldr
に、静的メソッド bar
を定義する classdef
ファイル foo
が含まれ、同じフォルダーにパッケージ関数 bar
を含むパッケージ +foo
が含まれているとします。
fldr/foo.m % bar is a static method of class foo fldr/+foo/bar.m % bar is a function in package foo
which foo.bar
の呼び出しは、パッケージ関数のパスを返します。
which foo.bar
fldr/+foo/bar.m