関数の優先順位
このトピックでは、現在のスコープに同じ名前の関数が複数存在する場合、MATLAB® が関数の呼び出しをどのように判定するのかについて説明します。現在のスコープには、現在のファイル、現在実行中の関数を基準とするオプションのプライベート サブフォルダー、現在のフォルダーおよび MATLAB パスが含まれます。
MATLAB では次の優先順位が使用されます。
変数
MATLAB では、名前が関数に一致すると見なす前に、現在のワークスペース内でその名前をもつ変数がないかどうかをチェックします。
メモ
関数と同じ名前をもつ変数を作成した場合、その変数がメモリからクリアされるまで MATLAB ではその関数を実行できません。
明示的にインポートされた名前と一致する名前をもつ関数やクラス
関数
import
を使うと、複合名 (ドットでつながれた複数の部分で構成された名前) をもつ関数を、複合名の最後の部分のみを使用して呼び出すことができます。関数名が、明示的に (ワイルドカードを使用せずに) インポートされた関数と一致する場合、MATLAB はインポートされた複合名を使用し、同じ名前をもつ他のすべての関数よりも優先します。現在の関数内の入れ子関数
現在のファイル内のローカル関数
ワイルドカードベースでインポートされた名前と一致する名前をもつ関数またはクラス
関数名が、ワイルドカードベースでインポートされた関数と一致する場合、MATLAB はインポートされた複合名を使用し、入れ子関数とローカル関数を例外として、同じ名前をもつ他のすべての関数よりも優先します。
プライベート関数
"プライベート" 関数は、現在実行中のファイルのフォルダーのすぐ下にある
private
というサブフォルダーに含まれる関数です。オブジェクト関数
オブジェクト関数は、その入力引数リストの特定のオブジェクトのクラスを受け入れます。同じ名前をもつ複数のオブジェクト関数がある場合、MATLAB は入力引数のクラスをチェックして、使用する関数を決定します。
@ フォルダー内のクラス コンストラクター
MATLAB では、クラス コンストラクターを使用してさまざまなオブジェクト (
timeseries
やaudioplayer
など) が作成されます。また、オブジェクト指向プログラミングによって独自のクラスを定義することもできます。たとえば、クラス フォルダー@polynom
とコンストラクター関数@polynom/polynom.m
を作成した場合、そのコンストラクターはパス上の任意の場所にあるpolynom.m
という名前の他の関数よりも優先されます。メモ
@ フォルダーで定義されたクラスを同じ名前の関数よりも優先させる規則は、将来のリリースで削除される予定です。詳細については、クラスの優先順位と MATLAB パスを参照してください。
読み込まれた Simulink® モデル
現在のフォルダー内の関数
パス上の他の部分にある関数 (出現順)
同じフォルダー内にある関数の優先順位を決める場合、MATLAB では次の順序でファイルの種類を検討します。
組み込み関数
MEX 関数
読み込まれていない Simulink モデル ファイル (次のファイル タイプ順):
SLX ファイル
MDL ファイル
.sfx
拡張子を持つ Stateflow® チャートMATLAB App Designer を使用して作成されたアプリ ファイル (
.mlapp
).mlx
拡張子を伴うプログラム ファイルP ファイル (
.p
拡張子を伴うエンコードされたプログラム ファイル).m
拡張子を伴うプログラム ファイル
たとえば、MATLAB で同じフォルダー内に同じ名前をもつ .m
ファイルと P ファイルが検出された場合は、P ファイルが使用されます。P ファイルは自動再生されないため、プログラム ファイルを編集する際は必ず P ファイルを再生してください。
特定の入力に対して MATLAB で呼び出される関数を指定するには、関数 which
の呼び出しにおいて関数名と入力を指定します。
関数の優先順位に関する規則の変更
R2019b 以降、MATLAB では名前の解決に関する規則が変更されます。変数、入れ子関数、ローカル関数および外部関数の優先順位がこの影響を受けます。変更の詳細およびコード更新のヒントについては、R2019b での関数の優先順位の変更に対するコードの更新を参照してください。
1 つの関数内で識別子を 2 つの目的に使用することはできない
明示的な宣言のない識別子は変数として扱われないことがある
変数は、親関数と入れ子関数の間で暗黙的に共有できない
複合名解決の優先順位の変更
無名関数は解決済みの識別子と未解決の識別子を含むことができる
関数 import
の動作が変更されました。
ワイルドカードベースのインポートでの優先順位の変更
完全修飾のインポート関数は、入れ子関数と同じ名前をもつことができない
完全修飾のインポートは、同名の外部スコープ定義より優先される
インポートが見つからない場合のエラー処理
入れ子関数は親関数から import ステートメントを継承する