主要内容

类定义中表达式的求值

为什么使用表达式

在类定义中使用的表达式可以是任何有效的MATLAB®评估到单个阵列的语句。使用表达式定义属性默认值和属性规范。表达式在其他值方面有助于导出值。例如,假设您要使用完全精度值定义常量属性2Π。您可以分配表达式返回的值的属性2 * pi.。MATLAB在首次加载类时评估该功能。

有关分配属性默认值和属性值的信息,请参阅以下主题:

在何处使用类定义中的表达式

以下是类定义中使用的表达式的一些示例:

Classdef.我的课%部分属性设置为逻辑值属性(常数=真)CNSTPROP = 2 * PI结尾属性这个类的%静态方法prop1 = myclass.setupaccount.此类中常数属性prop2 = myclass.cnstprop.返回一个值的函数Prop3 = datestr(现在)一个类构造函数prop4 = AccountManager.结尾方法(静态)函数accNum = setupAccount accNum = randi(9,[1,12]); / /用户账号结尾结尾结尾

当将默认值表达式的结果赋值给属性时,MATLAB不调用属性集方法。(见属性访问方法查阅有关这些特殊方法的信息。)

派生自MATLAB类型的枚举可以使用表达式来赋值:

Classdef.流量< int32枚举低(10)介质(流量.Low * 5)高(流量.Low * 10)结尾结尾

当第一次访问枚举成员时,MATLAB只计算一次这些表达式。

属性规范中的表达式

用于逻辑的属性值真正的,类定义可以使用表达式指定属性值。例如,这个赋值使我的课对于R2014b之前版本的MATLAB(不能被子类化)verlessthan.

Classdef.(密封= verlessthan('matlab''8.4')) 我的课

等号右边的表达式(=)必须评价为真正的。您不能在此表达式中使用类文件中的任何定义,包括任何常量属性,静态方法和本地功能。

虽然您可以使用条件表达式来设置属性值,但这样做可能会导致类定义根据外部条件更改。确保此行为与您的类设计一致。

笔记

允许津津银馆InferiorClasses属性需要一个专门的小区数组的规范meta.class对象作为它们的值。不能使用表达式返回这些值。

属性说明有关属性语法的更多信息。

指定默认属性值的表达式

属性定义允许您使用对变量没有引用的任何表达式指定属性的默认值。例如,VectorAngle定义常量属性(Rad2Deg),并在定义另一个属性的默认值()。默认值表达式也使用静态方法(getAngle)由类定义:

Classdef.VectorAngle属性(常数)Rad2Deg = 180/pi结尾属性角度= vectorangle.rad2deg * vectorangle.getangle([1 0],[0 1])结尾方法函数obj = vectorangle(vx,vy)obj.angle = vectorangle.getangle(vx,vy);结尾结尾方法(静态)函数r = getangle(vx,vy)计算二维向量之间的夹角CR = VX(1)* VY(1)+ Vx(2)* VY(2)/ SQRT(Vx(1)^ 2 + Vx(2)^ 2)*......SQRT(VY(1)^ 2 + VY(2)^ 2);r = ACOS(CR);结尾结尾结尾

您无法将输入变量与构造函数一起使用以定义默认值财产。例如,这个定义属性无效:

属性角= VectorAngle.Rad2Deg * VectorAngle.getAngle (vx, v)结尾

尝试创建实例会导致错误:

= VectorAngle ([1,0], [0,1])
使用VectorAgangle无法更新类别'VectorAgle'的错误,因为新定义包含错误:未定义的功能或变量'vx'。

类方法中的表达式

类方法中的表达式执行起来与任何函数中的表达式一样。当方法执行时,MATLAB在函数工作区中计算表达式。因此,在类方法中使用的表达式不被认为是类定义的一部分,本节也不讨论。

如何MATLAB计算表达式

MATLAB评估类定义中使用的表达式,而无需任何工作区。因此,这些表达式不能引用任何类型的变量。

MATLAB在类文件的上下文中评估表达式,因此这些表达式可以访问在MATLAB初始化类的路径上的其他类的任何函数,静态方法和常量属性。定义属性默认值的表达式可以访问自己类中定义的常量属性。

MATLAB计算表达式

MATLAB仅在初始化类时才评估类定义中的表达式。初始化发生在第一次使用该类之前。

初始化之后,这些表达式返回的值是类定义的一部分,并且对于类的所有实例都是常量。类的每个实例都使用表达式的初始求值结果,而不需要重新求值。

如果清除一个类,MATLAB会通过重新计算类定义中的表达式来重新初始化这个类。(见修改类的自动更新

手柄和价值类中的表达评估

下面的示例展示了value和handle对象在作为默认值分配给属性时的行为。假设您有以下类。

值类中的表达式

classexp.类有一个包含一个属性contclass.对象:

Classdef.contclass.属性指定当前日期和时间TimeProp = datestr(现在)结尾结尾
Classdef.classexp.属性objprop = countclass.结尾结尾

当你第一次使用classexp.类,Matlab创建了一个实例contclass.类。MATLAB此时初始化两个类。所有实例classexp.包括同一实例的副本contclass.

一个= ClassExp;a.ObjProp.TimeProp
ANS = 08-OCT-2003 17:16:08

TimeProp财产的contclass.对象包含MATLAB初始化类的日期和时间。创建其他实例的classexp.类显示日期字符串没有更改:

b = ClassExp;b.ObjProp.TimeProp
ANS = 08-OCT-2003 17:16:08

因为此示例使用包含对象的值类,所以每个实例classexp.拥有自己的对象副本。例如,假设您更改了TimeProp对象包含的属性classexp.目的B.

b.objprop.timeprop = datestr(现在)
ans = 08-Oct-2003 17:22:49

对象包含的对象的副本一种是不变的:

a.ObjProp.TimeProp
ANS = 08-OCT-2003 17:16:08

处理课程中的表达式

现在考虑包含的对象是句柄对象时的行为:

classdef ContClass < handle properties TimeProp = datestr(now) end结束

的两个实例classexp.类显示MATLAB在初始化contclass.。matlab使用了对象的副本处理的每个实例classexp.类。因此,有一个contclass.对象和Objprop.财产的classexp.对象包含其句柄的副本。

的实例classexp.类和注意创建时间:

一个= ClassExp;a.ObjProp.TimeProp
ans = 08- october -2003 17:46:01

创建第二个实例classexp.类。这Objprop.包含相同对象的句柄:

b = ClassExp;b.ObjProp.TimeProp
ans = 08- october -2003 17:46:01

重新分配所包含对象的值TimeProp属性:

b.ObjProp.TimeProp = datestr(现在);b.ObjProp.TimeProp
ans = 08- october -2003 17:47:34

Objprop.物业的财产B.包含与相同对象的句柄Objprop.物业的财产一种。价值TimeProp属性在此对象上也发生了更改:

a.ObjProp.TimeProp
ans = 08- october -2003 17:47:34

相关的话题