验证属性值

1 类定义中的属性验证

在MATLAB中可以对属性值进行特定限制,可以使用验证来约束属性值的类和大小。同样,可以使用函数建立属性值必须遵守的规则。MATLAB定义一系列验证函数,也可以定义自己的验证函数。

验证的语法如下所示:

code.matlab
classdef MyClass
    properties
        Prop(dim1,dim2,…) ClassName {fcn1,fcn2,…}=默认值
    end
end

其中,(dim1,dim2,…)定义属性值的大小,括号内的值定义每一维的大小,ClassName定义属性的类,(fcn1,fcn2,…)定义属性的验证函数,它们都是进行属性验证的代码。

下面的ValidateProps类定义3个带验证的属性。

code.matlab
classdef ValidateProps
	properties
		Location(1,3) double {mustBeReal, mustBeFinite}
		Label(1,:) char {mustBeMember(Label,{'High','Medium','Low'})}='Low'
		State(1,1) matlab.lang.OnOffSwitchState
	end
end
代码中,Location必须是double类型的数组,其值必须是实型的有限数。Label必须是字符型

代码中,Location必须是double类型的数组,其值必须是实型的有限数。Label必须是字符型向量,值必须是'High', 'Medium'或'Low',默认值为'Low'。State必须是matlab.lang.OnOffSwitchState类的枚举成员,值为off 或on。

创建一个ValidateProps类的对象,验证隐式或显式的默认值:

code.matlab
a=ValidateProps
a =
	ValidateProps with properties:
	Location: [0 0 0]
	Label: 'Low'
	State: off

创建对象时,MATLAB初始化Location属性的值为[0 0 0],Label属性的值取默认值'Low',State属性值设置为off。

MATLAB进行验证的顺序是:

类验证:进行类的转换,例如将char型数据转换为string型。

大小验证:该验证会导致大小转换,例如标量扩展或列向量转换为行向量。

验证器函数:MATLAB按照从左至右的顺序将类和大小的验证结果传递给每个验证函数。

Set方法:MATLAB在调用属性set方法之前进行属性验证,如果为该属性定义了一个的话。

2 大小验证

接着上面的代码讲。给Location属性赋一个标量值时,MATLAB应用标量扩展。

code.matlab
a=ValidateProps;
a.Location=1
a =
	ValidateProps with properties:
	Location: [1 1 1]

下面的代码中,MATLAB将列转换成行,以匹配大小的指定:

code.matlab
col=[1;1;1]
col =
	1
	1
	1
a.Location=col
a =
	ValidateProps with properties:
	Location: [1 1 1]

在指定大小时使用冒号,表示对应维的长度可以任意取。例如,下面的代码中,可以给Label属性赋任意长度的值。

code.matlab
classdef ValidateProps
	properties
		Label(1,:)
	end
end

在MATLAB命令窗口使用ValidateProps类:

code.matlab
a=ValidateProps;
a.Label='Click to Start'
a =
	ValidateProps with properties:
	Label: 'Click to Start'

3 属性类验证

可以使用任何MATLAB类或MATLAB支持的外部定义类,不包括Java类和COM类。

在属性定义块中,在属性名和可选的大小指定后面给出类的名称。

code.matlab
classdef MyClass
	properties
		Prop ClassName=defaultValue
	end
end

如果不指定默认值,MATLAB会给属性赋一个指定类的空对象。

下面的PropsWithClass类定义两个属性:

Number:值必须是double类型的,或转换为double类型的。

Today:值必须是char类型的,或转换为char类型的。默认值为char型向量,由date函数返回。

code.matlab
classdef PropsWithClass
	properties
		Number double
		Today char=date
	end
end

创建一个PropsWithClass类的对象。

code.matlab
p=PropsWithClass
p =
	PropsWithClass with properties:
	Number: []
	Today: '10-Jun-2018'

MATLAB将任何兼容的类转换为属性类。例如,下面将一个datetime数组赋给Today属性。

code.matlab
p.Today=[datetime('now'),datetime('tomorrow')];
disp(class(p.Today))
ans =
	char