主要内容

函数参数验证

介绍参数验证

函数参数验证声明特定的限制是一种函数输入参数。使用参数验证可以限制类,大小,和其他方面的函数体内输入值,无需编写代码的函数来执行这些测试。

函数参数验证是声明性,使MATLAB®桌面工具来提取信息函数通过检查特定的代码块。通过声明要求输入参数,可以消除繁琐的检查实参的代码,提高可读性,代码的健壮性和可维护性。

定义的函数参数验证语法简化了过程可选的,重复的,名称参数。语法还使您能够以一致的方式定义默认值。

使用参数验证在哪里

使用函数参数在函数定义中验证是可选的。参数验证是最有用的功能,可以被任何代码之前,必须确定输入的有效性执行该函数的代码。设计供他人使用的函数可以受益于适当的水平的限制参数输入和机会返回特定错误消息基于输入功能。

不需要验证在哪里

在地方和私有函数,在私有或受保护的方法,调用者知道输入要求,所以这些类型的函数可以被称为有效论证。

验证是不允许的在哪里

你不能使用参数验证语法在嵌套函数,抽象方法,或者处理类析构函数方法。在参数验证方法的更多信息,看一下在类方法参数验证

参数块语法

函数中定义参数验证代码块分隔的关键词参数结束。如果使用,一个参数块必须开始之前第一个可执行的函数。

您可以使用多个参数块在一个函数中,但是必须发生在任何代码块的一部分参数块。

下面的代码中突出显示的区域显示了参数的语法验证。

函数参数声明可以包括任何种类的限制:

  • 大小,每个维度的长度,括在括号里

  • 一个MATLAB类的类的名称

  • 函数——一个以逗号分隔的验证函数,包含在括号

您还可以定义一个默认值输入参数的函数验证声明的参数。默认值必须满足的宣布限制参数。

大小

验证输入参数的尺寸大小,用非负整数数字指定或冒号(:)。一个冒号表明任何尺寸的长度是允许的。你不能使用表达式维度。函数调用中的参数所指定的值必须符合指定的大小,或MATLAB抛出一个错误。

MATLAB索引分配规则适用于大小规格。例如,一个兼容的大小指定为1×1值(5,3)由于MATLAB应用标量扩张。同时,MATLAB row-column转换适用于指定为这样一个大小(:1)可以接受1)×(n, n×1的大小。

下面是一些例子:

  • (1,1)——输入必须完全1×1。

  • (3)第一个维度必须3,第二个维度可以是任何值。

如果你不指定大小,那么任何尺寸是允许的,除非受到验证功能。

验证类是一个类的名称。函数输入必须的值分配给指定的类或可兑换指定的类。使用MATLAB类或外部定义的类,由MATLAB支持,除了Java, COM类,以及不使用MATLAB类定义金宝appclassdef关键字(MATLAB软件7.6版本之前定义的类)。

下面是一些例子:

  • 字符——输入必须的类字符,或MATLAB可以转换为一个值字符,如字符串

  • ——输入可以是一个数值的精度。

  • 细胞——输入必须单元阵列。

  • 一个用户定义的类,比如枚举类,可以限制输入更具体的价值观和支持使您能够控制转换。金宝app

如果你不指定一个类,然后允许任何类,除非受到验证函数。

验证功能

验证函数是一个MATLAB函数将抛出一个错误如果某些参数值不满意的需求。验证函数不返回值,与类和大小不同,不能改变参数的值验证。

在验证过程中,MATLAB将参数值传递给每个验证函数列的论点。值传递到验证功能是任何转换的结果由类和尺寸规格。MATLAB调用每个函数从左至右,遇到的第一个错误。

预定义的表验证功能,请参阅参数验证功能

默认值

一个参数默认值可以是任何常数或表达满足大小、类,和验证功能的需求。指定一个默认值的参数声明使参数可选的。MATLAB使用默认值时,参数不包括在函数调用。默认值表达式是评估每一次使用的是默认的。

请注意

由于MATLAB验证默认值只有在函数被调用时没有值参数,一个无效的默认值会导致一个错误只有在函数被调用时没有这种说法。

可选参数必须定位在所需参数和函数签名参数块。可选参数的更多信息,请参阅必需和可选位置参数

验证序列

参数中从上到下进行验证参数块。MATLAB验证每个参数声明的一部分,在一个特定的顺序。首先验证了类,那么大小。类和大小的结果验证传递给验证功能。每个步骤是可选的取决于类,大小和验证函数的参数声明。

有关更多信息,请参见的参数验证

转换声明类和大小

两类验证和尺寸验证可以改变输入参数的值,因为标准的MATLAB转换规则。因此,验证值在函数体可以通过调用函数时不同的价值。转换规则由MATLAB的规则适用于索引任务的形式:

(指数)=值

MATLAB可以确定左边类和大小和价值要求,在某些情况下,可以把右边所需的类和大小的值。

相关信息,请参阅避免类和大小转换

论点的例子验证

参数块指定的大小和类三个输入框。

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

在这个函数中,变量必须满足这些验证需求:

  • 一个是一个字符串标量。

  • B是一个1-by-any长度向量双打。

  • C是一个2×2单元阵列。

值转换

下面的函数说明了如何转换为输入匹配中指定的类参数块。的SpeedEnum类是一个枚举类创建来定义允许第三输入参数的值。

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

这是枚举类。

classdefSpeedEnum < int32枚举完整的一半(100)(50)停止(0)结束结束

这个调用MATLAB的函数使用输入值可以转换为声明的类型。函数内的实际参数类型显示为输出。

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

特定的限制使用验证函数

验证函数以更具体的方式可以限制输入参数。您可以使用预定义的验证函数对于许多常见类型的验证,你可以定义自己的验证函数来满足特定需求。

例如,使用这个函数指定以下验证mustBeNumeric,mustBeReal,mustBeMember本地函数mustBeEqualSize

  • 输入x必须是真实的,数字行向量的长度。

  • 输入v必须是真实的,数字行向量大小一样吗x

  • 输入方法必须是一个特征向量的三个选择。因为方法指定一个默认值,这个参数是可选的。

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

避免使用函数参数验证在自定义验证功能。关于定义的更多信息验证功能和预定义的验证函数的列表,看看参数验证功能

类型的参数

函数参数验证可以声明四种参数。函数可以定义任何的这些参数,但是必须定义的参数按照以下顺序:

  1. 所需的位置参数

  2. 可选的位置参数

  3. 重复的位置参数

  4. 可选的参数名称

必需和可选位置参数

位置参数必须被传递给一个函数在一个特定的顺序。的位置值传入参数列表必须对应于订单中声明的参数参数块。所有参数名称参数块必须是唯一的。

位置参数的参数块需要调用函数时,除非参数定义了一个默认值。指定一个默认值的参数声明使一个位置参数可选因为MATLAB可以使用默认值,当没有值是函数调用中传递。

默认值可以是一个常量或表达式产生结果满足参数声明。表达式可以参考之前声明它的参数参数块,但不是参数声明。

MATLAB计算表达式只有当参数默认值不包括函数调用。

所有的可选参数都必须定位在所需的所有参数参数块。例如,在这个论点,maxvalminval有默认值,因此可选的。

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

你可以用这些语法调用这个函数:

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

一个可选的位置参数成为地位必须填写时需要的函数调用来确定参数。也就是说,如果您想要指定一个值minval,您必须指定一个值maxval

忽略了位置参数

MATLAB可以忽略输入参数通过一个波浪号字符(~在争论的地方。您可以定义一个函数,它忽略了未使用的位置参数通过添加一个波浪号字符(~)的参数块对应的位置参数的函数签名。添加一个波浪号字符(~)为每个忽略参数在函数签名。

忽略参数不能有默认值或指定类,大小,或验证功能。

加上字符(~)被视为一个可选的输入参数,除非它是紧随其后的是一个必需的位置参数。例如,在这个函数加上字符(~)代表一个可选的参数。

函数c = f (~)参数~结束%函数代码结束

你可以不带参数调用这个函数。

c = f

或者你可以用一个参数调用这个函数。

c = f (2)

在以下功能,加上字符(~)代表一个必需的参数。

函数c = f (x ~)参数~ x结束%函数代码结束

调用这个函数必须包括两个参数。

c = f (2、3)

与忽略输入调用函数的更多信息,参见忽略函数定义的输入

重复的参数

反复重复参数位置参数,可以指定作为输入参数。在一个声明重复参数参数块,包括重复属性。

参数(重复)__arg1最长……结束

函数只能有一个重复参数块,可以包含一个或多个重复的参数。

一个函数,定义了一个重复参数块可以被称为零个或多个事件的参数。如果调用函数包括重复参数,然后所有参数重复参数块必须包括对每一个重复。

例如,如果一个重复参数块定义参数xy,那么每个重复必须包含两个xy

重复的参数不能指定默认值,因此不能选。然而,您可以调用这个函数没有包括任何重复参数。

函数必须声明重复参数位置参数和后名称参数。你不能指定名称参数内重复块。名称-值参数的信息,请参阅名称-值参数

在函数中,每个重复论点成为细胞数组元素的个数等于重复中传递函数调用的数量。验证应用于细胞数组的每个元素。如果出现这个论点为零的函数被调用时,该单元阵列1-by-0大小。也就是说,它是空的。

例如,这个函数声明一块重复三个参数,x,y,选项

函数(伊势亚、yCell optionCell] = fRepeat (x, y,选项)参数(重复)xy选项{mustBeMember(选项,[“线性”、“立方”])}结束%函数代码%返回细胞数组伊势亚= x;yCell = y;optionCell =选项;结束

你可以调用这个函数没有输入或三个输入的倍数。MATLAB为每个参数创建一个单元阵列包含所有的值传递参数。这叫fRepeat通过两组三个重复的参数。

(伊势亚yCell optionCell] = fRepeat (1、2、“线性”、3、4、“立方”)
伊势亚= 1×2单元阵列{[1]}{[3]}yCell = 1×2单元阵列{[2]}{[4]}optionCell = 1×2单元阵列{[“线性”]}{[“立方”]}

下面的函数接受重复的理由xy输入一个重复参数块。在体内的功能,作为重复参数指定的值可在细胞阵列xy。这个例子上面的值xy匹配所需的输入情节功能:情节(x1, y1,…)

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

与重复调用这个函数对输入参数。

x1 = 1:10;日元=罪(x1);x2 = 0:5;y2 =罪(x2);myPlotRepeating (x1, y1, x2, y2)

避免使用变长度输入宗量重复的参数

使用变长度输入宗量不推荐功能,使用参数验证。如果变长度输入宗量被限制在大小或类重复参数块,然后限制适用于所有的值变长度输入宗量

如果你使用变长度输入宗量支持遗金宝app留代码,它必须是唯一的参数重复参数块。

例如,这个函数定义了两个位置参数和要求变长度输入宗量重复的参数。

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

名称-值参数

名称-值参数关联的名字和值传递给函数。名称-值参数:

  • 可以传递到函数在任何顺序

  • 总是可选

  • 必须声明毕竟位置参数和重复参数

  • 不能出现在一个参数块使用重复属性

  • 必须使用唯一名称,即使使用多个名称结构

  • 不能使用的名称也用于位置参数

在一个声明名称参数参数块使用点符号定义的字段结构。例如,名为结构NameValueArgs定义了两个名称-值参数,Name1Name2。您可以使用任何有效的MATLAB标识符作为结构名称。

参数NameValueArgs。Name1NameValueArgs。Name2结束

结构名称必须出现在函数签名。

函数myFunction (NameValueArgs)

使用名称的字段名称调用函数结构。

myFunction (Name1 = value1, Name2 = value2)

R2021a之前,通过名称字符串或字符向量和独立的名称和值用逗号。语法都是有效的在以后的版本。

结构的名称中使用的函数签名中的结构函数的名称空间,其中包含名称和值传递给函数。

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

名称-值参数支持部分名称匹配当没有歧义。金宝app例如,定义一个函数线宽线型两个名称-值参数接受LineW,但使用会导致错误。在一般情况下,推荐使用全名实践来提高代码的可读性,避免意想不到的行为。

名称-值参数的默认值

您可以指定一个默认值为每一个名字。如果你不指定一个默认值和名称的函数没有参数,然后在名称字段不存在结构。如果没有名称的参数传递给函数,MATLAB创建结构,但它没有字段。

来确定名称参数被传递的函数调用,使用isfield函数。

例如,下面的函数定义了两个必需的位置参数(宽度高度)和两个名称-值参数(线型线宽)。在这个例子中,选项结构有两个字段(线型线宽)包含默认值或值函数被调用时指定为名称参数。

函数myRectangle(宽度、高度、期权)参数宽度高度options.LineStyle(1,1)字符串=“-”options.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,“线型”,”:“)

使用重复和名称参数

如果函数重复定义参数,那么你必须声明在一个单独的名称参数参数块,遵循重复参数块。例如,该函数接受两个参数,重复xy。在指定所有的重复xy,您可以指定一个名称-值参数分配值日志PlotType的名字。

确定函数调用包括PlotType参数,使用isfield函数来检查PlotType字段规模结构。

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

调用这个函数有或没有名称参数。

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

R2021a之前,通过名称字符串或字符向量和独立的名称和值用逗号。例如:

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

多个名称结构

函数参数块可以包含多个名称的结构。然而,在所有结构字段名称必须是惟一的。这个函数有两个名称-值结构:lineOptionsfillOptions。这些结构不能有相同的字段名称。

的参数myRectangle函数是:

  • 宽度高度需要位置参数的类型

  • lineOptions.LineStyle是一个标量字符串的默认值吗“-”

  • lineOptions.LineWidth是一个标量数字的默认值吗1

  • fillOptions.Color是一个字符串。

  • fillOptions.Pattern没有限制它的价值。

函数myRectangle(宽度、高度、lineOptions fillOptions)参数宽度高度lineOptions.LineStyle(1,1)字符串=“-”lineOptions.LineWidth(1,1){mustBeNumeric}= 1 fillOptions.Color字符串fillOptions.Pattern结束%函数代码结束

强劲的处理名称参数

最佳实践实现名称的参数在函数是通过定义一个参数块。一个参数块消除了需要编写自己的代码来解析名称-值的参数,和块也有助于实现鲁棒参数解析的“名字”,价值语法和名称=值语法在R2021a引入。

实施有效的名称

定义一个名称-值参数的参数块确保名称是一个有效的标识符。反过来,这有助于确保你的论点与工作“名字”,价值名称=值语法。例如,一个使用无效的标识符的名称参数可以使用逗号分隔的语法:

myFunction(数据、“allow-empty”,真正的)
然而,同样的调用使用allow-empty = true抛出一个错误。定义名称-值参数的参数块确保你的名字定义有效的MATLAB函数名称和兼容名称=值语法。

避免与文本输入意想不到的结果

功能,包括可选的文本输入和名称参数运行的风险MATLAB解读文本输入的名称名称参数。这个函数包含两个可选文本输入和一个名称-值参数。

函数mySignal(标签、单位、选择)参数标签=“0”单位=“安”opts.Magnifier{mustBeMember {opts.Magnifier,“小”,“中”,“大”]}}结束结束
用户输入这个函数调用要设置的值标签“杂志”单位“库仑”:
mySignal (“杂志”,“库仑”)
然而,MATLAB,通过部分匹配,解析“杂志”名称-值的参数Magnifer“库仑”该名称不是一个有效的值,所以功能错误。

为了避免这个问题的方法之一是标签所需的参数通过移除它的默认值:

函数mySignal(标签、单位、选择)参数标签单元=“安”opts.Magnifier{mustBeMember {opts.Magnifier,“小”,“中”,“大”]}}结束结束
因为MATLAB不需要解析输入名称参数,相同的函数调用现在设置的值标签“杂志”并没有错误。

另一个选择是让所有三个输入名称参数。这可以帮助用户避免错误指定输入时,因为每个值与一个名字相关联时,与用户指定的输入不影响最后的结果。

从阶级属性名称参数

一个有用的功能语法在MATLAB使用一个类的公共属性名称的名称参数。为所有可设置的属性指定名称的参数定义的一个类(也就是说,所有公共属性SetAccess),在一个使用这种语法参数布洛克:

structName。?类名称

一个函数可以使用“structName。?类名称“语法只有一次。因此,可以定义一个函数只有一个名称-值结构字段名称来自一个类,即使使用不同的类和结构名称。

如果类地方限制的值可以通过使用属性分配给属性验证,那么函数验证适用于个人名称参数。信息产权验证,看看验证属性值

例如,该函数有两个参数,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。?类名称structNamePropertyName(dim2 dim1…)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 {:})结束

使用两个参数调用该函数,xy。可以通过任何支持的名称-值对酒吧功能和价值金宝appFaceColor这可以是红色的蓝色的。其他的值FaceColor是不允许的。

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

在类方法参数验证

验证方法在公共方法输入参数是非常有用的,因为不可能起源于类调用方法的代码。您可以使用在具体类函数参数验证方法,包括具体的抽象类中定义的方法。然而,抽象方法(方法实现的类)无法定义参数块。类方法的信息,请参阅方法抽象类和类成员

如果一个classdef文件包括在单独的文件中定义方法的原型方法,包括参数在单独的文件中定义的方法。在单独的文件中定义方法的更多信息,参见方法在单独的文件中

子类方法不能继承函数参数验证。在子类覆盖父类方法的方法,您可以添加相同的参数验证子类方法用于超类的方法。

处理类析构函数方法不能使用参数验证。一个方法命名删除在处理包含一个子类参数块不是视为一个析构函数。(换句话说,它不是由MATLAB调用当对象被销毁)。有关类析构函数方法的更多信息,请参阅处理类的析构函数

的参数验证

当一个函数被调用时,MATLAB验证输入参数中声明的顺序参数块,从上到下。每个参数完全验证之前下一个参数是验证。因此,任何引用先前宣布的论点被验证使用值。函数抛出一个错误的结果首先验证失败。

验证值可以不同于原始值作为输入传递函数被调用的时候。例如,这个函数声明类的输入uint32值。第三个输入声明分配一个默认值等于前两个输入的产物。

函数c = f (a, b, c)参数一个uint32buint32cuint32= a。* b结束%函数代码结束

调用函数的输入一个不同的数字类(例如,)的转换uint32

c = f (1.8, 1.5)

因为可选的输入参数c不是在函数调用中指定,MATLAB计算默认值并分配c转换后一个buint32值。在这种情况下,转换结果为输入值为2。因此,产品的一个b是四个。

c = uint32 4

如果你指定一个值第三输入,然后分配一个值的函数c,不评估默认值表达式。

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

避免类和大小转换

在验证过程中,MATLAB应用类,然后尺寸验证之前调用任何验证函数。如果使用一个默认值为一个可选的输入中省略的函数调用,这个值赋给参数之前应用验证过程中的任何步骤。

当一个参数值传递给一个函数类和大小不匹配所需的验证、MATLAB转换价值声明类和大小当转换是可能的。然而,转换可能不是所期望的行为。

这里有一些例子MATLAB可以执行的转换。

为了满足数字类限制:

  • 一个字符值可以转换为Unicode®数值。

  • 一个字符串可以转换为一个数字或如果字符串不是一个数字的表示。

为了满足大小限制:

  • 从标量nonscalar标量扩张可以改变大小。

  • 一个列向量可以转化成一个行向量。

消除标准转换由MATLAB从输入参数验证,使用验证函数而不是类和大小限制。调用验证函数不返回值,不能改变输入参数的值。

例如,这个函数限制第一个输入的任何大小的二维数组类。第二个输入必须是5-by-3任何类的数组。

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

因为标准MATLAB类型转换和标量扩展,你可以用下面的输入和调用这个函数没有收到一个验证错误。

f (的特征向量,144)

默认情况下,MATLAB将特征向量的元素转换为其等效数值和标量扩展适用于创建一个5-by-3标量值的数组144年

使用专门的验证功能可以提供更具体的输入参数验证。例如,这个函数定义了专门的验证功能,它使用的类和大小规格第一和第二参数。这些地方的功能使您能够避免输入值的转换。

  • mustBeOfClass限制了输入到一个特定的类不允许转换或子类。对于一个相关函数,看看mustBeA

  • mustBeEqualSize限制两个等大的输入是不允许标量扩张。对于一个相关函数,看看mustBeScalarOrEmpty

  • mustBeDims限制输入的指定尺寸不允许更换或标量扩张。对于一个相关函数,看看mustBeVector

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

mustBeOfClass函数执行严格的类匹配要求与类的名称匹配。一个更一般的方法可以使用isa函数也匹配指定的类的子类。

mustBeEqualSizemustBeDims函数执行严格的输入参数的声明。

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

在这个调用,第一个输入的维数是错误的,所以验证函数返回一个自定义的错误消息。

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

mustBeEqualSize验证器函数限制第二输入到一个特定的维度,这是提供的错误消息。

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

相关的预定义的验证功能,请参阅mustBeA,mustBeFloat,mustBeVector

输入参数个数在参数验证

输入参数个数函数返回的数量函数输入参数中给出调用当前执行的函数。使用函数参数验证时,返回的值输入参数个数在一个函数是位置参数的数量函数被调用时提供。

重复的参数位置参数的数量,因此重复传递到函数调用时的参数包含在返回的值输入参数个数

的价值输入参数个数返回不包含可选参数,不包括函数调用。同时,输入参数个数不计算任何名称参数。

使用输入参数个数确定可选位置参数传递给函数时调用。例如,这个函数声明三个位置参数和一个名称-值参数。这就是函数决定了参数传递时调用。

  • 输入参数个数确定可选位置参数c传递给函数的开关块。

  • isfield确定如果名称参数格式传递给函数。

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

这个函数调用的值输入参数个数2:

结果= fNargin (3、4)
结果= 7

这个函数调用的值输入参数个数3:

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

这个函数调用的值输入参数个数是3:

结果= fNargin(3、4、7.62、格式=“银行”)
结果= 43020.56

限制变量和函数访问

参数块中存在函数的工作区。任何包、类或函数添加到函数的使用范围进口命令被添加到的范围参数块。

验证器的唯一变量可见功能和默认值表达式的输入变量已经宣布。这个函数的默认值c来自一个b

函数c = f (a, b, c)参数一个uint32buint32cuint32= a * b结束%函数代码结束

不过,你不能把输入变量还没有宣布的参数块。例如,使用此声明为参数一个是无效的,因为在前面的函数bc尚未宣布。

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

参数验证表达式可以参考此前宣布,因此验证参数。验证函数名称和默认值参数不能访问其他名称参数。

限制功能参数

对先前宣布的任何引用参数必须在文本中可见的验证功能和默认值。确保代码透明,不使用函数与函数的工作区。具体地说,不要使用嵌套函数或在下表中列出的任何功能参数块。

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

这些限制仅适用于内参数块和不适用于变量或函数的身体功能。

调试参数块

而内部调试的参数块工作区只读。这意味着它可以检查工作区并查看分配给变量的值。然而,它是不可能创建新变量或改变的值分配给现有的变量而工作区是只读的。一旦调试器以外的参数块将再次可以创建或编辑变量。

另请参阅

|

相关的话题