Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

インデックス メソッド用の nargout および nargin の変更

引数の数を変更するタイミング

既定では、MATLAB®subsref を呼び出すために使用する出力引数の数は、インデックス操作によって参照される値の数によって決まります。同様に、MATLAB が subsasgn を呼び出すために使用する入力引数の数は、インデックス付き代入操作で代入する値の数によって決まります。

クラスの設計で、インデックス操作で定義された数と異なる数の値をインデックス操作によって返したり代入したりする必要がある場合、numArgumentsFromSubscript を使用して必要な数を指定します。numArgumentsFromSubscript は、subsrefnargout および subsasgnnargin を制御します。

ユーザー クラスで numArgumentsFromSubscript を使用する場合は subsref および subsasgn のメソッドを実装し、インデックス操作によって返されたり代入されたりする実際の値を定義してください。

MATLAB Release R2015b より前のリリースでは、MATLAB は、コンマ区切りリストに値を返すまたは代入する一部のインデックス式で異なる結果を生成しました。以前のリリースの動作に依存するコードをサポートするには、numArgumentsFromSubscript を使用します。また、現在では、numel の代わりに numArgumentsFromSubscript をオーバーロードすることで、numel の動作を再定義することなく特定の結果を達成できます。

引数の数の変更方法

クラスが numArgumentsFromSubscript をオーバーロードする場合、MATLAB は numel の代わりにこのメソッドを呼び出して subsrefnargout および subsasgnnargin に想定される引数の数を計算します。

クラスが numArgumentsFromSubscript をオーバーロードしない場合は、MATLAB は numel を呼び出して nargout または nargin の値を計算します。

MATLAB は、3 つの入力引数を使用して numArgumentsFromSubscript を呼び出します。

function n = numArgumentsFromSubscript(obj,s,indexingContext)
   ...
end
入力引数説明

obj

subsref メソッドまたは subsasgn メソッドが呼び出されるオブジェクト

s

インデックスのタイプと操作で使用されるインデックスを含むインデックス付け構造体

indexingContext

インデックス操作が発生するコンテキスト (ステートメントとして使用されるインデックス付き参照、関数の引数として使用されるインデックス付き参照およびインデックス付き代入)

MATLAB は、インデックス付きの参照と代入で numArgumentsFromSubscript から返された値を使用します。numArgumentsFromSubscript の実装で indexingContext の値をテストすることで、インデックス操作が実行されるコンテキストを判定します。たとえば、考えられるインデックス コンテキストの一部または全部をテストします。

function n = numArgumentsFromSubscript(obj,~,indexingContext)
   switch indexingContext
      case matlab.mixin.util.IndexingContext.Statement
         n = ...; % nargout for indexed reference used as statement
      case matlab.mixin.util.IndexingContext.Expression
         n = ...; % nargout for indexed reference used as function argument
      case matlab.mixin.util.IndexingContext.Assignment
         n = ...; % nargin for indexed assignment
   end
end

詳細と例は、numArgumentsFromSubscript を参照してください。

メモ

MATLAB Version R2015b 以降のリリースでは、numel の代わりに numArgumentsFromSubscript をオーバーロードしてユーザー クラスのインデックスをカスタマイズしてください。

関連するトピック