主要内容

代码模式subsref和subsasgn方法

R2021b和后,自定义索引的推荐过程是使用模块化的索引代替重载父类subsrefsubsasgn。有关更多信息,请参见定制对象索引

自定义索引引用和任务

用户定义的类具有相同的索引的内置类的行为。类可以定制索引操作通过重载MATLAB的函数®调用索引表达式进行评估。超载subsrefsubsasgn功能当你想定义索引引用和分配的特殊行为。

语法subsref和subsasgn方法

MATLAB调用subsrefsubsasgn你的类的方法和这些参数。

方法 输入 输出

b = subsref (obj, s)

  • obj- - - - - -对象或对象数组索引表达式中使用

  • 年代——索引结构

b——索引表达式的结果

obj = subsasgn (obj,年代,b)

  • obj- - - - - -对象或对象数组索引表达式中使用

  • 年代——索引结构

  • b——价值分配

obj作业后,对象或对象数组

修改数量的参数

如果你的类设计要求索引操作返回或者分配一个不同的值的数量比定义的默认索引操作,过载numArgumentsFromSubscript函数来控制nargoutsubsref输入参数个数subsasgn。的更多信息和示例,请参阅numArgumentsFromSubscript

索引结构描述索引表达式

索引结构包含描述信息索引表达式。类方法使用索引结构来评估中的信息表达和实现自定义行为。

例如,CustomIndex类定义了一个属性,您可以使用索引表达式。

classdefCustomIndex属性DataArray结束结束

创建一个对象并分配一个5-by-5矩阵创建的魔法函数DataArray财产。

一个= CustomIndex;一个。DataArray =魔法(5);

这个下标引用表达式返回的第一行5-by-5矩阵。

:a.DataArray (1)
ans = 17 24 1 8 15

这个表达式将新值赋给数组存储在第一行DataArray财产。

:a.DataArray (1) = (1 2 3 4 5);

这个赋值语句使用:

  • 一个“。”引用类型

  • 属性名称后点(即DataArray)

  • 一系列指标(1,:括号内)

索引结构中包含这些信息类型潜艇字段。

值的索引结构

当执行一个索引表达式,MATLAB调用类subsrefsubsasgn方法,如果类重载这些函数。的一个参数传递给方法的索引结构。索引结构有两个字段:

  • 类型——三种可能的索引类型之一:“。”,“()”,“{}”

  • 潜艇——一个字符向量的属性名或单元数组索引使用的表达式,包括:结束

如果索引表达式是一个复合表达式,那么MATLAB通过一个结构数组,一个结构体为每个索引。例如,在这个表达式:

:a.DataArray (1)

数组的索引结构年代这些值:

  • (1).type被设置为“。”,这表明第一个索引操作是一个点。

  • (1).subs设置为属性名,“DataArray”

第二个级别的索引是第二个元素的索引结构:

  • (2).types被设置为“()”括号表示第二个索引操作索引

  • (2).subs被设置为一个单元阵列包含指标{[1],[:]}

典型模式索引方法

超载了subsrefsubasgn功能:

  • 确定完整的索引表达式使用类型潜艇字段的索引结构。

  • 实现专业为支持的索引操作类的行为。金宝app

  • 返回相应的值或修改对象的调用MATLAB。

一个开关语句是一种方便的方法来检测的第一级索引。有三种类型的indexing-dot,括号,括号。每一个情况下块的开关语句实现的所有索引表达式开始,一级类型的索引。

方法必须实现所有索引表达式类支持。金宝app如果你不定制一个特定类型的索引、调用内置的函数来处理这个表达式。

使用索引结构数组的长度和索引类型为复合索引表达式定义条件语句。

代码框架subsref方法

下面的框架subsref方法显示了如何在条件语句中使用信息的索引结构。这里没有显示您的应用程序可能涉及其他表达式。

函数varargout = subsref (obj,年代)开关(1).type情况下“。”如果长度(s) = = 1%实现obj.PropertyNameelseif长度(s) = = 2 & & strcmp (s (2) .type,“()”)%实现obj.PropertyName(指数)其他的[varargout {1: nargout}] =内装式(“subsref”obj,年代);结束情况下“()”如果长度(s) = = 1%实现obj(指数)elseif长度(s) = = 2 & & strcmp (s (2) .type,“。”)%实现obj .PropertyName(印第安纳州)elseif长度(s) = = 3 & & strcmp (s (2) .type,“。”)& & strcmp (s (3) .type,“()”)%实现obj(指数).PropertyName(指数)其他的%使用内置的其他表情[varargout {1: nargout}] =内装式(“subsref”obj,年代);结束情况下“{}”如果长度(s) = = 1%实现obj{指数}elseif长度(s) = = 2 & & strcmp (s (2) .type,“。”)% obj{指数}.PropertyName实现其他的%使用内置的其他表情[varargout {1: nargout}] =内装式(“subsref”obj,年代);结束否则错误(不是一个有效的索引表达式的)结束

使用varargout的返回值使方法与对象数组。例如,假设您想要支持一个以逗号分隔的回归这样的表达式:金宝app

(x1,…xn) = objArray。PropertyName(指数)

这个表达式的结果在一个双元素数组索引结构。第一级类型是点(“。”),第二层次是括号(“()”)。构建varargout单元阵列中的每个值数组。

情况下“。”如果长度(s) = = 2 & & strcmp (s (2) .type,“()”)支持= s (1) .subs;%属性名n =元素个数(obj);%的元素数组varargout =细胞(1,n);% Preallocate单元阵列k = 1: n varargout {k} = obj (k)。(道具)。(s (2) .subs);结束结束结束

subsasgn模式

下面的框架subsasgn方法展示了如何使用索引结构条件语句实现赋值操作。

函数obj = subsasgn (obj,年代变长度输入宗量)%允许下标赋值未初始化变量如果isequal (obj, [])% obj = ClassName.empty;结束开关(1).type情况下“。”如果长度(s) = = 1%实现obj.PropertyName= varargin{:};elseif长度(s) = = 2 & & strcmp (s (2) .type,“()”)%实现obj.PropertyName(指数)=变长度输入宗量{:};其他的%调用内置的其他情况obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束情况下“()”如果长度(s) = = 1%实现obj(指数)=变长度输入宗量{:};elseif长度(s) = = 2 & & strcmp (s (2) .type,“。”)%实现obj(指数)。PropertyName= varargin{:};elseif长度(s) = = 3 & & strcmp (s (2) .type,“。”)& & strcmp (s (3) .type,“()”)%实现obj(指数).PropertyName(指数)=变长度输入宗量{:};其他的%使用内置的其他表情obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束情况下“{}”如果长度(s) = = 1%实现obj{指数}=变长度输入宗量{:}elseif长度(s) = = 2 & & strcmp (s (2) .type,“。”)% obj{指数}.PropertyName实现= varargin{:}%使用内置的其他表情obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束否则错误(不是一个有效的索引表达式的)结束结束

使用变长度输入宗量右值的赋值语句使方法与对象数组。例如,假设您想要支持一个以逗号分隔的分配这样的表达式:金宝app

C ={“一”,“两个”;“三个”};[objArray。PropertyName]= C {:}

这个表达式的结果在一个索引结构点类型(“。”)索引单元阵列C赋值语句的右边产生一个逗号分隔的列表。这段代码分配一个对象数组中的每个属性列表项。

情况下“。”如果长度(s) = = 1 = s (1) .subs提案;%属性名n =元素个数(obj);%的元素数组k = 1: n obj (k)。(道具)=变长度输入宗量{k};结束结束结束

下标和未初始化的变量赋值

指定一个元素的未初始化的变量在调用结果subsasgn方法类的右边的任务。例如,这个类定义了一个subsasgn方法简单地调用内置的subsasgn括号索引的方法。

classdefMyClass方法函数obj = subsasgn (obj,年代变长度输入宗量)开关(1).type情况下“()”obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束结束结束结束

当试图分配的对象MyClass未初始化变量的第一个元素,B (1)在接下来的声明,MATLAB调用subsasgn的方法MyClass一个空的双([])作为第一个参数。赋值会导致一个错误,因为subsasgn方法必须通过一个对象的类。

清晰的BB (1) = MyClass;
以下错误发生转换从MyClass到双:转换从MyClass双是不可能的。误差在MyClass / subsasgn(第6行)obj =内装式(subsasgn, obj,年代,变长度输入宗量{:});

subsasgn方法可以检测到这种情况,采取适当的行动,如返回一个有用的错误消息如果类不支持这种类型的作业,或将输入转换为类的一个对象,并通过它来金宝appsubsasgn

例如,因为MyClass可以允许下标赋值未初始化的变量,subsasgn方法的第一个参数可以改变空双空MyClass对象。

使用isequal函数检查输入和静态方法创建一个空对象。

classdefMyClass方法函数obj = subsasgn (obj,年代变长度输入宗量)如果isequal (obj, []) obj = MyClass.empty;结束obj =内装式(“subsasgn”obj,年代变长度输入宗量{:});结束结束结束

下标赋值未初始化的变量现在避免以前的错误。

清晰的BB (1) = MyClass;
B = MyClass没有属性。

相关的话题