使用无法获得功能输入;

时间:2016-11-17 03:31:58

标签: matlab

我定义了以下类

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;最后。

1 个答案:

答案 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的注释

这不会成为Octave中的问题,因为它允许&#34;链接&#34;这些下标引用在一起而不需要临时变量。