我定义了以下类
classdef TimerManager < handle
methods (Access = private)
function obj = TimerManager()
end
end
methods (Static)
function singleObj = getInstance(varargin)
varargin{1}
singleObj = TimerManager();
end
end
methods
function foo(obj)
end
end
end
我发现以下代码的工作方式不同w /或w / o; 这是预期的吗?或者我错过了什么?
>> TimerManager.getInstance(0).foo()
ans =
0
>> TimerManager.getInstance(0).foo();
Index exceeds matrix dimensions.
Error in TimerManager.getInstance (line 13)
varargin{1}
如果我在side getInstance中使用nargin,如果我放了则为0;最后。
答案 0 :(得分:3)
您的错误与分号无关。这与MATLAB处理对象的下标引用(subsref
)的方式有关。
在MATLAB中,你不能&#34;链&#34;下标引用。例如,如果我们创建一个单元格数组,我们就不能立即索引到这个单元格数组而不首先将它分配给一个临时变量:
X1 = {'X1', 'X2', 'X3'}{1}
错误:不平衡或意外的括号或括号。
这同样适用于访问函数返回的对象的属性或方法。在您的情况下,TimerManager.getInstance
会返回一个实例,您必须先将该实例分配给临时变量,然后才能访问该foo
方法。
instance = TimerManager.getInstance(0);
fooResult = instance.foo();
当MATLAB认为您正在尝试链接&#34;时,它会尝试抛出错误或警告。这些下标引用在一起,但如果存在下标操作顺序有效的情况,则它无法抛出相应的错误。您遇到了其中一种情况。
您使用的语法如下所示:
a.b(c).d()
如果a.b
是一个structs
数组,其字段为d
,这是一个函数句柄,则此选项有效。在这种情况下,c
是索引。
当MATLAB解析它时,它将检索a.b
的值,然后确保c
是一个正整数(一个有效的索引)并且在数组的范围内a.b
。然后,一旦确认,MATLAB将访问d
字段并调用它。
如果我们回到您的代码一秒钟,我们可以注释掉varargin{1}
行并获得更有用的错误消息。
TimerManager.getInstance(0).foo();
下标索引必须是实数正整数或逻辑。
好的,这样有意义,MATLAB将TimerManager.getInstance
视为struct
数组并尝试使用0
进行索引,这显然无效并导致错误。
关于您报告的实际错误,请注意上面我说过在对假定的struct
数组应用下标引用之前,MATLAB需要先获取当前值{ {1}}。因为MATLAB认为这只是一个TimerManager.getInstance
数组,所以它不会将任何输入参数传递给它,这导致struct
为空并且您看到的错误
所以你的陈述在功能上与:
相同varargin
请注意,如果&#34;输入&#34; 。 instance = TimerManager.getInstance; % No input arguments
instance(0).foo() % Indexing error
的{{1}}是getInstance
,因为这是您在没有输入的情况下调用1
时返回的1 x 1
TimerManager
个实例数组的有效索引。
Timermanager.getInstance
使用临时变量
TimerManager.getInstance(1).foo();
或者使用instance = TimerManager.getInstance(0);
fooResult = instance.foo();
表示法来调用方法而不是method(obj)
表示法。
obj.method()
这不会成为Octave中的问题,因为它允许&#34;链接&#34;这些下标引用在一起而不需要临时变量。