主要内容

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

関数の引数の検証

引数の検証の紹介

関数の引数の検証は,関数の入力引数に特定の制限を宣言するための1 1 .の方法です。引数の検証を使用すると,関数の入力値のクラス,サイズ,および他の特性を制約することができ,これらのテストを実行するコードを関数本体に記述する必要はありません。

関数の引数の検証は宣言型であるため,matlab®デスクトップドブロックを調べて関数に関する情報を抽出できます。入力引数の要件を宣言することにより、煩雑な引数チェックのコードをなくし、コードの可読性、ロバスト性、および保守性を向上させることができます。

関数の引数の検証構文により,オプション引数,繰り返し引数,および名前と値の引数を定義するプロセスが簡略化されます。また,この構文を使用すると,一貫した方法で既定値を定義できるようになります。

引数の検証を使用する場所

関数の引数の検証は,関数定義でオプションとして使用します。引数の検証が最も役に立つのは,任意のコードで呼び出され,関数コードを実行する前に入力の有効性を判定しなければならない関数内です。作成者以外が使用するために設計されている関数では,引数入力に対する適切なレベルの制限と,その関数への入力に基づいて特定のエラーメッセージを返す機会があると,役立つ場合があります。

検証が必要でない場所

ローカル関数とプライベート関数,およびプライベートメソッドや保護されたメソッドでは,呼び出し元で入力の要件が認識されるため,これらのタイプの関数は有効な引数を指定して呼び出すことができます。

検証が許可されていない場所

引数の検証構文は,入れ子関数,抽象メソッド,またはハンドルクラスのデストラクターメソッドでは使用できません。メソッド内での引数の検証の詳細にいては,クラスメソッド内での引数の検証を参照してください。

参数ブロック構文

関数は,キワド参数および结束で区切られたコドブロック内で引数の検証を定義します。使用した場合,参数ブロックは関数の最初の実行可能行より前に開始されなければなりません。

関数内で複数の参数ブロックを使用できますが,すべてのブロックは,参数ブロックの一部ではないコドより前になければなりません。

以下のコドの強調表示されている部分は,引数検証の構文を示しています。

関数の引数の宣言には,以下の種類の制限をどれでも含めることができます。

  • サ邮箱ズ—各次元の長さ。小かっこで囲みます。

  • クラス-単一のmatlabクラスの名前。

  • 関数-検証関数のコンマ区切りリスト。中かっこで囲みます。

入力引数の既定値を,その引数にいての関数の検証宣言内で定義することもできます。既定値は,その引数に対して宣言された制限を満たさなければなりません。

サ邮箱ズ

検証サズは入力引数の次元であり,非負の整数値またはコロン(で指定します。コロンは,その次元で任意の長さが許可されることを示します。次元には式を使用できません。関数呼び出しで引数に代入される値は、指定されたサイズと適合していなければならず、そうでない場合、MATLAB はエラーをスローします。

サesxiズの指定には,matlabのesxiンデックス付き代入の規則が適用されます。たとえば,1行1列の値は(5,3)として指定されたサ,ズと適合しますが,これは,matlabでスカラ,拡張が適用されるためです。また,matlabの行と列の変換が適用され,(: 1)と指定されたサereplicationズは1行n列およびn行1列のサereplicationズを受け入れることができます。

以下にいくかの例を示します。

  • (1,1)—入力は厳密に1行1列でなければならない。

  • (3)—最初の次元は3でなければならず,2番目の次元は任意の値にできる。

サereplicationズを指定しない場合,検証関数で制限されていない限り,任意のサereplicationズが許可される。

クラス

検証クラスは単一のクラスの名前です。関数の入力に代入される値は、指定されたクラスであるか、指定されたクラスに変換可能でなければなりません。Java クラスと COM クラス、およびclassdefキーワードを使用しないMATLABクラス定義(MATLABソフトウェア7.6版本より前に定義されたクラス)を除く,任意のMATLABクラス,またはMATLABでサポートされている外部定義クラスを使用してください。

以下にいくかの例を示します。

  • 字符-入力は字符クラスか,または字符串のようにmatlabで字符に変換可能な値でなければならない。

  • -任意の精度の数値が入力可能。

  • 细胞—入力はcell配列でなければならない。

  • 列挙型クラスなど,ユーザー定義のクラスでは入力をより具体的な値に制限でき,サポートされる変換を制御できる。

クラスを指定しない場合,検証関数で制限されていない限り,任意のクラスが許可される。

検証関数

検証関数は,引数値が特定の要件を満たさない場合にエラをスロするmatlab関数です。検証関数は値を返さず,クラスやサeズとは異なり,検証対象の引数の値を変更できません。

検証プロセス中,matlabは引数用にリストされている各検証関数にその引数の値を渡します。検証関数に渡される値は、クラスとサ以及ズの指定によって行われた変換の結果です。MATLABは各関数を左から右の順序で呼び出し、最初に見つかったエラーをスローします。

事前定義された検証関数の表は,引数の検証関数を参照してください。

既定値

引数の既定値には,サeズ,クラス,および検証関数の各要件を満たす任意の定数または式を使用できます。引数の宣言で既定値を指定すると,その引数は任意になります。MATLABは,関数呼び出しに引数が含まれていない場合、その既定値を使用します。既定値の式は、既定値が使用されるたびに評価されます。

メモ

MATLABは,引数の値を指定せずに関数が呼び出された場合にのみ既定値を検証するため,無効な既定値は,その引数を指定せずに関数が呼び出された場合にのみエラーになります。

オプションの引数は,関数シグネチャと参数ブロック内で必須の引数の後に配置しなければなりません。オプションの引数の詳細にいては,必須の位置引数とオプションの位置引数を参照してください。

検証シケンス

引数は,参数ブロックで上から下へと検証されます。MATLABは引数宣言の各部分を特定の順序で検証します。最初にクラスが、次にサイズが検証されます。クラスとサイズの検証結果が検証関数に渡されます。クラス、サイズ、検証関数が引数宣言にあるかどうかによって、各ステップは任意になります。

詳細にいては,引数の検証の順序を参照してください。

宣言されたクラスおよびサ邮箱ズへの変換

MATLABの標準的な変換規則により,クラス検証とサイズ検証はどちらも入力引数の値を変更できます。そのため,関数本体で検証された値が,関数の呼び出し時に渡された値と異なる場合があります。変換規則は,matlabが次の形式の,源码源码ンデックス付き代入に適用する規則から派生しています。

A(indexes) = value

MATLABは,左辺の値にクラスやサイズに関する要件があるかどうかを判定でき,場合によっては,右辺の値を必要なクラスやサイズに変換できます。

関連情報にいては,クラスとサ邮箱ズの変換の回避を参照してください。

引数の検証の例

次の参数ブロックは,3の入力のサ。

函数out = myFunction(A, B, C)参数一个(1,1)字符串B(: 1)增加一倍C(2, 2)细胞结束%功能代码...结束

この関数では,変数は以下の検証要件を満たさなければなりません。

  • 一个はstringスカラ;

  • Bは1行で任意の長さ列のdoubleのベクトル。

  • Cは2行2列のcell配列。

値の変換

以下の関数は,参数ブロックで指定されたクラスと一致させるために,入力を変換する方法を示しています。SpeedEnumクラスは,3番目の入力引数が取り得る値を定義するために作成された列挙型クラスです。

函数forwardSpeed (a, b, c)参数一个b字符cSpeedEnum结束%功能代码Disp ((a)类Disp ((b)类Disp ((c)类)结束

列挙型クラスは次のようになります。

classdefSpeedEnum < int32枚举满(100)半(50)停(0)结束结束

関数に対するこの呼び出しでは,宣言された型にmatlabが変換できる入力値が使用されます。関数内の実際の引数の型が出力として表示されます。

forwardSpeed (int8 (4),“字符串”“全部”
双字符SpeedEnum

検証関数を使用した特定の制限

検証関数は,より具体的な方法で入力引数を制限できます。事前定義された検証関数を多くの一般的な種類の検証に使用したり,特定の要件を満たす独自の検証関数を定義することができます。

たとえば,以下の関数はmustBeNumericmustBeRealmustBeMember,およびロカル関数mustBeEqualSizeを使用して,次の検証を指定します。

  • 入力xは任意の長さの実数値行ベクトルでなければならない。

  • 入力vxと同じサ邮箱ズの実数値行ベクトルでなければならない。

  • 入力方法は,許可された3の選択肢のいずれかにあたる文字ベクトルでなければならない。方法は既定値を指定しているため,この引数は任意です。

函数myInterp (x, v,方法)参数x(: 1) {mustBeNumeric, mustBeReal}v(: 1) {mustBeNumeric、mustBeReal mustBeEqualSize (v, x)}方法(: 1)字符{mustBeMember(方法,{“线性”、“立方”、“花键”})}“线性”结束%功能代码...结束%自定义验证功能函数mustBeEqualSize (a, b)测试大小相等如果isequal(size(a),size(b)) eid =尺寸:不等号的;味精=第一个输入的大小必须等于第二个输入的大小;throwAsCaller (MException(开斋节,味精))结束结束

関数の引数の検証は,カスタムの検証関数内では使用しないでください。検証関数の定義の詳細、および事前定義された検証関数のリストについては、引数の検証関数を参照してください。

引数の種類

関数の引数の検証では,4種類の引数を宣言できます。関数は、これらの種類の引数をどれでも定義できますが、引数は以下の順序で定義しなければなりません。

  1. 必須の位置引数

  2. オプションの位置引数

  3. 繰り返しの位置引数

  4. オプションの名前と値の引数

必須の位置引数とオプションの位置引数

位置引数は,特定の順序で関数に渡さなければなりません。引数リスト内で値が渡される位置は,参数ブロックで引数が宣言される順序に対応していなければなりません。参数ブロック内の引数名はすべて一意でなければなりません。

参数ブロック内の位置引数は,引数で既定値が定義されていない限り,関数の呼び出しに際して必要です。引数の宣言で既定値を指定すると,位置関数は任意になります。これは,関数呼び出しで値が渡されない場合、MATLAB は既定値を使用できるためです。

既定値には,定数か,または引数宣言を満たす結果を生成する式を指定できます。式は,参数ブロック内でそれより前に宣言されている引数を参照できますが,それより後に宣言される引数は参照できません。

Matlabは,関数呼び出しに引数が含まれていない場合にのみ,既定値の式を評価します。

参数ブロックでは,すべてのオプションの引数を,すべての必須の引数の後に配置しなければなりません。たとえば,次の引数ブロックでは,maxvalminvalは既定値をもためオプションとなります。

函数myFunction (x, y, maxval minval)参数x(: 1)增加一倍y(: 1)增加一倍maxval(1,1)的两倍= max(max(x),max(y)(1,1)的两倍= min (min (x) min (y))结束%功能代码...结束

この関数は,次のいずれかの構文を使用して呼び出すことができます。

myFunction(x,y,maxval,minval) myFunction(x,y,maxval)

オプションの位置引数は,後続の引数を識別するために関数呼び出し内でその位置を埋める必要がある場合には,必須になります。まり,minvalの値を指定する場合は,maxvalの値を指定しなければなりません。

無視される位置引数

Matlabでは,チルダ文字()を引数の代わりに渡すことにより,入力引数を無視できます。関数シグネチャの引数の位置に対応する arguments ブロック内で、チルダ文字 ()を追加することで,未使用の位置引数を無視する関数を定義できます。関数シグネチャ内の無視される引数それぞれにチルダ文字(を追加します。

無視される引数は既定値をも。

チルダ文字()は,その後に必須の位置関数が続いていない場合,オプションの入力引数として扱われます。たとえば,次の関数ではチルダ文字(はオプションの引数を表します。

函数C = f(~)参数结束%功能代码结束

この関数は,引数を指定せずに呼び出すことができます。

C = f

また,この関数は,1の引数を指定して呼び出すこともできます。

C = f(2)

次の関数では,チルダ文字(は必須の引数を表します。

函数C = f(~,x)参数~ x结束%功能代码...结束

この関数の呼び出しには,どらの引数も含まれていなければなりません。

C = f(2,3)

無視される入力を指定した関数呼び出しの詳細にいては,関数定義の入力の無視を参照してください。

繰り返し引数

繰り返し引数は,入力引数として繰り返し指定可能な位置引数です。重复属性を含む参数ブロック内で繰り返し引数を宣言します。

参数(重复)arg1 arg2…结束

関数は重复参数ブロックを1のみもことができ,これには1以上の繰り返し引数を含めることができます。

重复参数ブロックを定義する関数は,ブロック内のすべての引数の0回以上の出現で呼び出すことができます。関数の呼び出しに繰り返し引数が含まれる場合,重复参数ブロック内のすべての引数がそれぞれの繰り返しに含まれていなければなりません。

たとえば,重复参数ブロックが引数xおよびyを定義する場合は,それぞれの繰り返しにxyの両方が含まれていなければなりません。

繰り返し引数は既定値を指定できないため,オプションにはできません。ただし,繰り返し引数を含めずに関数を呼び出すことはできます。

関数では,繰り返し引数を位置引数の後に,か名前と値の引数の前に宣言しなければなりません。名前と値の引数は重复ブロック内で指定できません。名前と値の引数の詳細については、名前と値の引数を参照してください。

関数内で,各繰り返し引数は,関数呼び出しで渡される繰り返しの数と等しい数の要素をもつ细胞配列になります。请拨打配列の各要素に検証が適用されます。この引数の使用を0に指定して関数を呼び出すと,细胞配列のサイズは1行0列になります。まり,これは空になります。

たとえば,次の関数では3の繰り返し引数xy,および选项のブロックが宣言されます。

函数[xCell,yCell,optionCell] = fRepeat(x,y,option)参数(重复)xy选项{mustBeMember(选项,[“线性”、“立方”])}结束%功能代码返回单元格数组xCell = x;yCell = y;optionCell = option;结束

入力なし,または3の倍数回入力を指定してこの関数を呼び出すことができます。MATLABは,各引数に対して、その引数に渡されるすべての値を含む cell 配列を作成します。次のfRepeatの呼び出しでは,3の繰り返し引数が2セット渡されます。

[xCell,yCell,optionCell] = fRepeat(1,2,“线性”、3、4、“立方”
xCell = 1×2 cell array {[1]} {[3]} yCell = 1×2 cell array {[2]} {[4]} optionCell = 1×2 cell array {["linear"]} {["cubic"]}

次の関数は,重复参数ブロック内でxyの入力に繰り返し引数を受け入れます。この関数の本体において,繰り返し引数として指定された値は单元配列xおよびyで使用できます。この例では,情节(x1, y1,…)のようにxおよびyの値を交互に配置して,関数情节に必要な入力に一致させています。

函数myPlotRepeating (x, y)参数(重复)x(: 1)增加一倍y(: 1)增加一倍结束%功能代码交叉x和yZ = shape([x;y],1,[]);调用绘图函数如果~ isempty (z)情节(z {:});结束结束

入力引数の繰り返しのペアを指定して,この関数を呼び出します。

X1 = 1:10;y = sin(x1);X2 = 0:5;Y2 = sin(x2);myPlotRepeating (x1, y1, x2, y2)

繰り返し引数に变长度输入宗量を使用しない

引数検証を使用する関数で变长度输入宗量を使用することは推奨されません。变长度输入宗量のサズとクラスが繰り返し引数ブロック内で制限されている場合,この制限は变长度输入宗量のすべての値に適用されます。

レガシコドをサポトするために变长度输入宗量を使用する場合,これは重复参数ブロック内の唯一の引数でなければなりません。

たとえば,次の関数は2の必須の位置引数に加えて,变长度输入宗量を繰り返し引数として定義します。

函数F (a, b, varargin)参数一个uint32buint32结束参数(重复)变长度输入宗量结束%功能代码...结束

名前と値の引数

名前と値の引数は,関数に渡される値に名前を関連付けます。名前と値の引数には,次の特徴があります。

  • 任意の順序で関数に渡すことができる

  • 常にオプションである

  • すべての位置引数と繰り返し引数の後に宣言しなければならない

  • 重复属性を使用する参数ブロック内では使用できない

  • 名前と値の構造体を複数使用する場合でも,一意の名前を使用しなければならない

  • 位置引数にも使用されている名前は使用できない

ドット表記を使用して参数ブロック内で名前と値の引数を宣言し,構造体のフィルドを定義します。たとえば,NameValueArgsという名前の構造体は,2 .の名前と値の引数Name1およびName2を定義します。任意の有効なmatlab識別子を構造体名として使用できます。

参数NameValueArgs。Name1NameValueArgs。Name2结束

構造体名は関数シグネチャ内になければなりません。

函数myFunction (NameValueArgs)

名前と値の構造体のフィルド名を使用して,関数を呼び出します。

myFunction (Name1 = value1, Name2 = value2)

R2021aより前は,弦または文字ベクトルとして名前を渡し,名前と値をコンマで区切ります。両方の構文は以降のリリスでも有効です。

関数シグネチャ内で使用される構造体の名前は,関数に渡される名前と値を含む関数ワークスペース内の構造体の名前です。

函数result = myFunction(NameValueArgs)参数NameValueArgs。Name1NameValueArgs。Name2结束%功能代码result = NameValueArgs。Name1* NameValueArgs.Name2;结束
r = myFunction(Name1=3,Name2=7)
R = 21

あいまいさがない場合は,名前と値の引数は名前の部分一致をサポトします。たとえば,线宽および线型を2の名前と値の引数として定義する関数は,LineWを受け入れますが,を使用するとエラになります。一般に,コードの可読性を向上させ,予期しない動作を回避するために,完全名を使用することが推奨されます。

名前と値の引数の既定値

それぞれの名前に既定値を指定できます。既定値を指定せずに、その名前と値の引数なしで関数が呼び出される場合、そのフィールドは名前と値の構造体に存在しません。名前と値の引数が関数に渡されない場合、MATLAB は構造体を作成しますが、そこにフィールドはありません。

関数呼び出しで渡された名前と値の引数を特定するには,関数isfieldを使用します。

たとえば,次の関数は2の必須の位置引数(宽度高度)および2の名前と値の引数(线型线宽を定義します。この例では,选项構造体には2のフィルド(线型线宽)があり,既定値か,または関数の呼び出し時に名前と値の引数として指定された値が含まれています。

函数myRectangle(宽度、高度、期权)参数宽度高度选项。行tyle(1,1)字符串“-”选项。LineWidth(1,1) {mustBeNumeric}= 1结束%功能代码...结束

以下の構文はすべて,この関数を呼び出す有効な方法です。

myRectangle(4、5)myRectangle(4、5、线型=”:“线宽= 2)myRectangle(4、5、线宽= 2,线型=”:“) myRectangle(4、5、线型=”:“) myRectangle(4、5、线宽= 2)

R2021aより前は,弦または文字ベクトルとして名前を渡し,名前と値をコンマで区切ります。以下に例を示します。

myRectangle(4、5、“线型””:““线宽”2) myRectangle(4、5、“线宽”2,“线型””:“

繰り返し引数および名前と値の引数の使用

関数で繰り返し引数が定義されている場合,繰り返し引数ブロックに続く別の参数ブロック内で名前と値の引数を宣言しなければなりません。たとえば,次の関数は2の繰り返し引数xyを受け入れます。xyの繰り返しをすべて指定した後に,値または日志を名前PlotTypeに代入する名前と値の引数を指定できます。

関数呼び出しにPlotType引数が含まれるかどうかを判定するには,関数isfieldを使用して规模構造体のPlotTypeフィルドをチェックします。

函数myLinLog (x, y,规模)参数(重复)x(: 1)增加一倍y(: 1)增加一倍结束参数规模。PlotType(1,1)字符串结束Z = shape([x;y],1,[]);如果isfield(规模、“PlotType”如果规模。PlotType = =“林”情节(z {:})elseif规模。PlotType = =“日志”重对数(z {:})结束结束结束

名前と値の引数を指定して,または指定せずに,この関数を呼び出します。

myLinLog(1:5,1:5,1:10,1:100:1000) myLinLog(1:5,1:5,1:10,1:100:1000,PlotType= . myLinLog(1:5,1:5,1:10,1:100:1000“日志”

R2021aより前は,弦または文字ベクトルとして名前を渡し,名前と値をコンマで区切ります。以下に例を示します。

1:100:1000 myLinLog (1:5, 1:5, 1:10,“PlotType”“日志”

複数の名前と値の構造体

関数の引数ブロックには,複数の名前と値の構造体を含めることができます。ただし,フィルド名は構造体全体で一意でなければなりません。以下の関数には,lineOptionsfillOptionsという2の名前と値の構造体があります。これらの構造体は同じフィルド名をもことができません。

関数myRectangleの引数は次のとおりです。

  • 宽度高度型の必須の位置引数である。

  • lineOptions。线型は既定値“-”をも。

  • lineOptions。线宽は既定値1をもスカラ数値である。

  • fillOptions。颜色はstringである。

  • fillOptions。模式には値の制限がない。

函数myRectangle(宽度、高度、lineOptions fillOptions)参数宽度高度lineOptions。线型(1,1)字符串“-”lineOptions。线宽(1,1) {mustBeNumeric}= 1 fillOptions。颜色字符串fillOptions。模式结束%功能代码...结束

名前と値の引数のロバストな処理

関数に名前と値の引数を実装するためのベストプラクティスは,その引数を引数ブロックで定義することです。引数ブロックでは,名前と値の引数を解析するための独自コ,ドを作成する必要がなく,“名字”,价值構文とR2021aで導入された名称=值構文の両方に対応するロバストな引数解析を実装できます。

有効な名前の適用

引数ブロックで名前と値の引数を定義すると,名前が確実に有効な識別子になります。これにより,引数が“名字”,价值名称=值の両方の構文で確実に機能するようになります。たとえば,無効な識別子を使用している名前と値の引数は、コンマ区切りの構文では機能できます。

myFunction(数据、“allow-empty”,真正的)
ただし,allow-empty = trueを使用した同じ呼び出しでは,エラがスロされます。引数ブロックで名前と値の引数を定義すると,定義した名前が確実に有効なmatlab変数名になり,名称=值構文に適合します。

テキスト入力での予期しない結果の回避

オプションのテキスト入力および名前と値の引数の両方を含む関数では,MATLABによってテキスト入力が名前と値の引数の名前として解釈されるおそれがあります。次の関数には,2のオプションのテキスト入力と1の名前と値の引数が含まれています。

函数mySignal(标签、单位、选择)参数标签=“0”单位=“安”选择。放大镜{mustBeMember{选择。放大镜,["small","medium","big"]}}结束结束
ユザが,标签の値を“杂志”单位の値を“库仑”に設定するもりで,次の関数呼び出しを入力します。
mySignal (“杂志”“库仑”
しかし,matlabは,部分一致によって“杂志”を名前と値の引数Magniferとして解析します。“库仑”はその名前に対して有効な値ではないため,この関数はエラになります。

これを回避する方法の1として,标签の既定値を削除してそれを必須の引数にする方法があります。

函数mySignal(标签、单位、选择)参数标签单位=“安”选择。放大镜{mustBeMember{选择。放大镜,["small","medium","big"]}}结束结束
Matlabは必須の入力を名前と値の引数として解析しないため,今回は同じ関数呼び出しで标签の値が“杂志”に設定され,エラは発生しません。

もう1の方法として,3すべての入力を名前と値の引数にする方法があります。これにより,各値が名前に関連付けられるため,ユーザーは入力を指定するときに誤りを回避でき,ユーザーが入力を指定する順序は最終結果に影響しません。

クラスプロパティからの名前と値の引数

MATLABには,クラスのパブリックプロパティを名前と値の引数の名前に使用する便利な関数構文があります。クラスで定義されたすべての設定可能なプロパティ(まり,パブリックの.SetAccessをもすべてのプロパティ)に名前と値の引数を指定するには,参数ブロックで次の構文を使用します。

structName。?类名称

関数は,”structName.?类名称構文を1回だけ使用できます。したがって,関数は、異なるクラスと構造体名を使用する場合でも、クラスからフィールド名を取得する名前と値の構造体は 1 つしか定義できません。

クラスでプロパティ検証を使用して,プロパティに代入できる値を制限している場合,関数はその検証を個々の名前と値の引数に適用します。プロパティ検証の詳細にいては,プロパティ値の検証を参照してください。

たとえば,次の関数は2の必須の引数xyをも,matlab.graphics.chart.primitive.Barクラスの任意のパブリックプロパティ名と値を受け入れます。

函数propArgs myBar (x, y)参数x(::)翻倍y(::)翻倍propArgs ? matlab.graphics.chart.primitive.Bar结束propertyCell = namedargs2cell(propArgs);栏(x, y, propertyCell {:})结束

必須の入力と,任意の設定可能なプロパティの名前と値のペアを指定して,関数を呼び出します。

X = [1,2,3;4,5,6];Y = x.^2;myBar (x, y) myBar (x, y, FaceColor =“红色”BarLayout =“分组”

R2021aより前は,弦または文字ベクトルとして名前を渡し,名前と値をコンマで区切ります。以下に例を示します。

myBar (x, y,“FaceColor”“红色”“BarLayout”“分组”

特定のプロパティのオバラド

参数ブロック内で,プロパティ名を特定の名前と値の引数で再定義することにより,クラスのプロパティ検証をオーバーライドできます。

structName。?类名称structName.PropertyName (dim1 dim2,…)ClassName {fcn1, fcn2,…}

特定の名前と値の引数の検証は,個別に指定されたプロパティ名に対しクラスで定義された検証をオーバーライドします。

たとえば,以下の関数は名前と値の引数をmatlab.graphics.chart.primitive.Barクラスのプロパティとして定義します。また,この関数は,特定の値红色的または蓝色的のみが許可されるように,プロパティ名FaceColorをオバラドします。

matlab.graphics.chart.primitive.BarクラスでのFaceColorの既定値は,制限された値(红色的または蓝色的のいずれでもありません。したがって,オーバーライドする宣言では、検証関数mustBeMemberによって課された制限を満たす既定値を代入しなければなりません。まり,既定値は红色的または蓝色的でなければなりません。

この関数は関数namedargs2cellを使用して,名前と値の構造体を,交互に配置された名前と値を含む单元配列に変換します。

函数propArgs myBar (x, y)参数x(::)翻倍y(::)翻倍propArgs ? matlab.graphics.chart.primitive.BarpropArgs.FaceColor{mustBeMember (propArgs.FaceColor{‘红’,‘蓝色’})}“蓝色”结束propertyCell = namedargs2cell(propArgs);栏(x, y, propertyCell {:})结束

2 ecommの必須の引数xyを使用して関数を呼び出します。オプションで,関数吧でサポ,トされる任意の名前と値のペアと,FaceColorの値(红色的または蓝色的のいずれか)を渡します。FaceColorの他の値は許可されません。

X = [1,2,3;4,5,6];Y = x.^2;myBar (x, y) myBar (x, y, FaceColor =“红色”,BarLayout =“分组”)

クラスメソッド内での引数の検証

メソッド入力引数の検証はパブリックメソッド内で有用です。これは,メソッドの呼び出しがクラス コードから発生していない可能性があるためです。関数の引数の検証は、抽象クラスで定義された具象メソッドを含む具象クラス メソッドで使用できます。ただし、具象メソッド (クラスによって実装されていないメソッド) は、参数ブロックを定義できません。クラスメソッドの詳細については、メソッドおよび抽象クラスとクラスメンバを参照してください。

classdefファイルに,別々のファイルで定義されたメソッドのメソッドプロトタイプが含まれる場合,メソッドを定義しているその別々のファイルに参数ブロックを含めます。別のファルでメソッドを定義する方法の詳細にいては,別ファ邮箱ルのメソッドを参照してください。

サブクラスメソッドは,関数の引数の検証を継承しません。スーパークラスメソッドをオーバーライドするサブクラスメソッドでは,スーパークラスメソッドで使用されているものと同じ引数の検証をサブクラスメソッドに追加できます。

ハンドルクラスのデストラクタメソッドは,引数の検証を使用できません。参数ブロックを含むハンドルサブクラス内の删除という名前のメソッドは,デストラクターとして扱われません(つまり,オブジェクトが破棄されるときにMATLABで呼び出されない)。クラスデストラクタメソッドの詳細にいては,ハンドルクラスのデストラクタを参照してください。

引数の検証の順序

関数が呼び出されると,matlabは入力引数をそれらが参数ブロックで宣言されている順序,まり上から下への順序で検証します。各引数は,次の引数が検証される前に完全に検証されます。したがって,前に宣言された引数へのすべての参照では、検証済みの値が使用されます。最初の検証が失敗すると、関数はエラーをスローします。

検証された値は,関数の呼び出しに際して入力として渡された元の値と異なる場合があります。たとえば,次の関数はクラスuint32の値として入力を宣言します。3.番目の入力の宣言は、最初の 2 つの入力の積に等しい既定値を代入します。

函数C = f(a, b, C)参数一个uint32buint32cuint32= a .* b结束%功能代码...结束

異なる数値クラス(など)の入力を指定して関数を呼び出すと,uint32に変換される結果となります。

C = f(1.8,1.5)

関数呼び出しでオプションの入力引数cが指定されていないため,matlabは,一个およびbuint32値に変換した後,既定値を評価してcに代入します。この場合,変換の結果,どらの入力の値も2になります。したがって,一个bの積は4になります。

C = uint32 4

3番目の入力に値を指定する場合,関数は値をcに代入し,既定値の式は評価しません。

C = f(1.8,1.5,25)
C = uint32 25

クラスとサ邮箱ズの変換の回避

検証プロセス中,MATLABは検証関数を呼び出す前に,クラスの検証を適用してから,サイズの検証を適用します。関数呼び出しで省略されているオプションの入力に既定値が使用されている場合、検証プロセスのステップで適用する前に、この値が引数に代入されます。

関数に渡される引数の値が検証に必要なクラスとサイズに一致しない場合,MATLABは,変換が可能であれば,その値を宣言されたクラスとサイズに変換します。ただし,変換が望ましい動作ではない場合があります。

Matlabで実行可能な変換の例をここにいくか挙げます。

数値クラスの制限を満たす場合は次のとおりです。

  • 字符値をそのUnicode®数値に変換可能。

  • 字符串が単一の数値を表していない場合,字符串を数値またはに変換可能。

サ邮箱ズの制限を満たす場合は次のとおりです。

  • スカラ拡張はサ。

  • 列ベクトルを行ベクトルに変換可能。

MATLABによって実行される標準の変換を入力引数の検証から排除するには,クラスおよびサイズの制限の代わりに検証関数を使用します。検証関数の呼び出しは値を返さず,入力引数の値を変更することはできません。

たとえば,次の関数は最初の入力を,クラスである任意サ邮箱ズの2次元配列に制限します。2番目の入力は、任意のクラスの 5 行 3 列の配列でなければなりません。

函数f (a, b)参数一个(::)翻倍b(5,3)结束%功能代码...结束

MATLABの標準の型変換とスカラー拡張のため,次の入力を指定してこの関数を呼び出しても検証エラーを受け取ることはありません。

f (的特征向量, 144)

既定で,matlabは文字ベクトルの要素を等価な数値に変換し,スカラ拡張を適用してスカラ値144から5行3列の配列を作成します。

特殊な検証関数を使用して,より具体的な入力引数の検証を行うことができます。たとえば,この関数は、最初と 2 番目の引数に関するクラスとサイズの仕様の代わりに使用する、特殊な検証関数を定義します。これらのローカル関数によって、入力値の変換を回避できるようになります。

  • mustBeOfClassは入力を特定のクラスに制限し,変換またはサブクラスを許可しません。関連する関数にいては,mustBeAを参照してください。

  • mustBeEqualSizeは2の入力を等しいサ。関連する関数にいては,mustBeScalarOrEmptyを参照してください。

  • mustBeDimsは入力を指定された次元に制限し,転置またはスカラ拡張を許可しません。関連する関数にいては,mustBeVectorを参照してください。

函数fCustomValidators (a, b)参数一个{mustBeOfClass(“双”),mustBeDims (a, 2)}b{mustBeEqualSize (b)}结束%功能代码...结束自定义验证器函数函数mustBeOfClass(输入类名)测试特定的类名Cname = class(input);如果~strcmp(cname,className) eid =“类:notCorrectClass”;MSG = [“输入必须是有等级的”cname);throwAsCaller (MException(开斋节,味精))结束结束函数mustBeEqualSize (a, b)测试大小相等如果isequal(size(a),size(b)) eid =尺寸:不等号的;味精=“输入的大小必须相等。”;throwAsCaller (MException(开斋节,味精))结束结束函数numDims mustBeDims(输入)测试维度数如果~isequal(length(size(input)),numDims) eid =“大小:wrongDimensions”;MSG = [输入必须有维度:num2str (numDims)];throwAsCaller (MException(开斋节,味精))结束结束

関数mustBeOfClassは,クラス名の一致を必須として厳密なクラスの照合を適用します。より一般的な手法では,関数isaを使用して,指定されたクラスのサブクラスも照合できます。

関数mustBeEqualSizeおよびmustBeDimsは,入力引数の厳密な宣言を強制します。

fCustomValidators (的特征向量, 144)
位置1的输入参数无效。Input必须是double类

この呼び出しでは,最初の引数の次元数が正しくないため,検証関数はカスタムエラーメッセージを返します。

fCustomValidators ((2, 2, 4), 144)
位置1的输入参数无效。输入必须有两个维度

検証関数mustBeEqualSizeは2番目の入力を特定の次元に制限します。この次元はエラメッセジに提示されます。

fCustomValidators((2, 2), 144年)
位置2的输入参数无效。输入必须有大小[5 3]

関連する事前定義された検証関数にいては,mustBeAmustBeFloatおよびmustBeVectorを参照してください。

引数の検証での输入参数个数

関数输入参数个数は,現在実行中の関数の呼び出し時に渡された関数入力引数の数を返します。関数の引数の検証を使用する場合,関数内で输入参数个数から返される値は,関数の呼び出し時に指定された位置引数の数です。

繰り返し引数は位置引数であるため,関数の呼び出し時に渡された繰り返し引数の数は输入参数个数で返される値に含まれます。

输入参数个数が返す値には,関数呼び出しに含まれていないオプションの引数は含まれません。また,输入参数个数は名前と値の引数をカウントしません。

関数の呼び出し時にオプションの位置引数が渡されるかどうかを判定するには,输入参数个数を使用します。たとえば,次の関数は3.つの位置引数と 1 つの名前と値の引数を宣言します。呼び出しに際して渡される引数を関数がどのように判定するかを以下に示します。

  • 输入参数个数は,オプションの位置引数cが関数に渡されるかどうかを开关ブロックで判定。

  • isfieldは,格式の名前と値の引数が関数に渡されるかどうかを判定。

函数result = fNargin(a,b,c,namedargs)参数一个(1,1)的两倍b(1,1)的两倍c(1,1)的两倍= 1 namedargs。格式(: 1)字符结束%功能代码开关输入参数个数情况下2 .结果= a + b;情况下3 result = a^c + b^c;结束如果isfield (namedargs“格式”)格式(namedargs.Format);结束结束

この関数呼び出しでは,输入参数个数の値は2です。

result = fNargin(3,4)
结果= 7

この関数呼び出しでは,输入参数个数の値は3.です。

result = fNargin(3,4,7.62)
结果= 4.3021e+04

この関数呼び出しでは,输入参数个数の値は3です。

result = fNargin(3,4,7.62,Format=“银行”
结果= 43020.56

変数および関数へのアクセスの制限

参数ブロックは関数のワクスペス内にあります。进口コマンドを使用して関数のスコプに追加されたパッケジ,クラスまたは関数はすべて,参数ブロックのスコプに追加されます。

検証関数と既定値の式から参照できる変数は,既に宣言されている入力変数のみです。次の関数では,cの既定値は一个bから派生します。

函数C = f(a,b, C)参数一个uint32buint32cuint32= a * b结束%功能代码...结束

しかし,参数ブロックでまだ宣言されていない入力変数は,参照できません。たとえば,前の関数で次の宣言を引数一个に使用することは有効ではありません。これは,bcがまだ宣言されていないためです。

参数A uint32 = b * c b uint32 c uint32结束

引数の検証の式は,先に宣言された引数,まり検証済みの引数のみを参照できます。検証関数と,名前と値の引数の既定値は,他の名前と値の引数にアクセスできません。

参数ブロック内の関数の制限

先に宣言された変数への参照はすべて,検証関数と既定値のテキスト内で可視でなければなりません。コドの透明性を確保するため,関数ワスとやり取りする関数は使用しないでください。具体的には,入れ子関数や次の表にリストされている関数を参数ブロックで使用しないでください。

assignin 内装式 清晰的
dbstack eval evalc
evalin 存在 函数宏指令
输入 inputname 负载
输入参数个数 narginchk nargoutchk
保存

これらの制限は,参数ブロック内でのみ適用され,関数本体の変数や関数には適用されません。

引数ブロックのデバッグ

引数ブロック内でデバッグしている間,ワクスペスは“読み取り専用”になります。まり,ワークスペースを確認したり、変数に割り当てられた値を表示したりすることはできます。ただし、ワークスペースが読み取り専用の間に、新しい変数を作成したり、既存の変数に割り当てられた値を変更したりすることはできません。デバッガーが引数ブロックの範囲外になると、再び変数の作成または編集が可能になります。

参考

|

関連するトピック