在大多数OO语言中,变量可能指向对象,它们也可能具有空值,这非常方便。
在Matlab中,我有一个解析命令的函数,然后返回一个单元格数组,或false
(如果它失败则等于零 - 这是另一种常见模式):
function re = parse(s)
...
if (invalid)
re = false;
return;
end
end
问题在于,当我检查结果时,它会出错:
re = parse(s);
if (false == re)
Undefined function 'eq' for input arguments of type 'cell'.
我已经编写了一个函数来检查它而没有错误:strcmp('logical', class(re)) && false == re
,但是在代码的热区域使用它似乎很慢,如果我必须添加这个函数也很不方便我写的每个M档。
使用NaN
更糟糕,因为除了抛出该错误之外,它也不等于它自己。
使用此模式的更好选择是什么?
答案 0 :(得分:3)
您可以使用isequal
功能比较任意两项而不会导致该错误。例如:
if isequal (re, false)
%code here
end
答案 1 :(得分:2)
一个不错的选择是使用空数组:[]
和isempty(re)
来检查。这不会引发错误。
参考:http://www.mathworks.com.au/matlabcentral/newsreader/view_thread/148764
答案 2 :(得分:1)
如果你可以改变函数parse
,一个解决方案就是返回两个输出参数[re status] = parse(s)
,其中status
是逻辑变量。如果成功则将其设置为true,否则设置为false。
答案 3 :(得分:1)
如果它不是有效的结果,我会使用空单元格{}
。使用空矩阵是MATLAB标准(参见Evgeni Sergeev的答案),但是使用空单元格而不是空数字数组可确保您总是得到相同类型的结果。
另一方面,如果空单元格数组{}
是函数的有效结果,那么我会使用异常来表示问题:
if invalid
error('Parse:InvalidArgumentError', 'The input is invalid.');
end
确保使用适当的错误ID(error
的第一个参数),以便在调用函数时可以准确捕获该异常:
try:
result = parse(something);
catch ME
if strcmp(ME.identifier, 'Parse:InvalidArgumentError')
fprintf('Ooops\n');
else
% Some other error
ME.rethrow();
end
end
答案 4 :(得分:0)
我认为问题在于matlab函数不返回指针而是返回值的副本。
恕我直言,最好的方法是定义自己的“指针”类。在里面你可以定义一个“isNull()”命令,甚至覆盖比较以产生你想要的行为。