- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我定义了下面的类
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}
如果我在 getInstance 端使用 nargin,则它是 0 ;在最后。
最佳答案
您的错误与分号无关。这与 MATLAB 处理对象的下标引用 (subsref
) 的方式有关。
在 MATLAB 中,您不能“链接”下标引用。例如,如果我们创建一个元胞数组,我们不能立即索引到这个元胞数组而不先将它分配给一个临时变量:
X1 = {'X1', 'X2', 'X3'}{1}
Error: Unbalanced or unexpected parenthesis or bracket.
这同样适用于访问由函数返回的对象的属性或方法。在您的情况下,TimerManager.getInstance
返回一个实例,您必须先将其分配给一个临时变量,然后才能访问它的 foo
方法。
instance = TimerManager.getInstance(0);
fooResult = instance.foo();
当 MATLAB 认为您试图将这些下标引用“链接”在一起时,它会尝试抛出错误或警告,但如果存在下标操作顺序有效的情况,则它无法抛出适当的错误。您正在经历其中一种情况。
您使用的语法类似于以下内容:
a.b(c).d()
如果 a.b
是一个 structs
的数组,d
的字段是一个函数句柄,则这是有效的。在这种情况下,c
是一个索引。
当 MATLAB 解析它时,它将检索 a.b
的值,然后确保 c
是一个正整数(有效索引)并且在数组 a.b
。一旦确认,MATLAB 将访问 d
字段并调用它。
如果我们回到您的代码一秒钟,我们可以注释掉 varargin{1}
行并获得更有用的错误消息。
TimerManager.getInstance(0).foo();
Subscript indices must either be real positive integers or logicals.
好吧,这是有道理的,MATLAB 将 TimerManager.getInstance
视为一个 struct
数组,并尝试使用 0
对其进行索引> 这显然是无效的并导致错误。
关于您报告的实际错误,注意上面我说过在对假设的struct
数组应用下标引用之前,MATLAB 需要首先获取当前的TimerManager.getInstance
的值。因为 MATLAB 认为这只是一个 struct
数组,所以它不会将任何输入参数传递给它,这会导致 varargin
为空以及您看到的错误.
所以你的声明在功能上与:
instance = TimerManager.getInstance; % No input arguments
instance(0).foo() % Indexing error
请注意,如果 getInstance
的“输入”是 1
,这会起作用,因为这是 1 的有效索引x 1
TimerManager
实例数组,当您在没有输入的情况下调用 Timermanager.getInstance
时返回。
TimerManager.getInstance(1).foo();
使用临时变量
instance = TimerManager.getInstance(0);
fooResult = instance.foo();
或者使用method(obj)
表示法来调用方法,而不是obj.method()
表示法。
foo(TimerManager.getInstance(0))
这一切在 Octave 中都不会成为问题,因为它允许将这些下标引用“链接”在一起而无需临时变量。
关于matlab - 无法使用 ; 获取函数输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40646269/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!