Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

パッケージによる名前空間の作成

パッケージ フォルダー

パッケージは、クラス フォルダーや、関数ファイルとクラス定義ファイル、その他のパッケージを含むことができる特別なフォルダーです。クラスおよび関数の名前はパッケージ フォルダーのスコープをもちます。パッケージは、名前が一意でなければならない名前空間です。関数名とクラス名はパッケージ内に限り一意でなければなりません。パッケージを使用することにより、クラスと関数を整理する手段が提供されます。また、パッケージ化することで、クラスと関数の名前を他のパッケージで再使用できるようにもなります。

メモ

パッケージは、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.MyFirstClassmyFcn と呼ばれるメソッドをもつ場合、オブジェクトを呼び出すメソッドと同様にして呼び出します。

obj = mypack.MyFirstClass;
myFcn(obj,arg);

mypack.MyFirstClassMyProp と呼ばれるプロパティをもつ場合、ドット表記とオブジェクトを使用して割り当てます。

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 

関連するトピック