我希望通过()
和{}
为我的一个MATLAB类重载索引。这可以通过为该类实现subsref
来实现,并且可以正常工作。
但是,我还希望通过.
保持索引的默认行为(即访问方法和属性)。我尝试使用以下代码:
function x = subsref(this, S)
if strcmp(S(1).type, '{}')
% My own implementation here
elseif strcmp(S(1).type, '()')
% My own implementation here
elseif strcmp(S(1).type, '.')
x = builtin('subsref', this, S);
else
error('Unknown index variant.');
end
但是,这不起作用,因为我不知道调用builtin('subsref', this, S)
将返回多少输出参数。特别是,我的类的方法可能返回可变数量的参数,输出参数的数量取决于其输入参数的数量和值。一个MATLAB example for subsref
笔记:
When you implement a subsref method for a class, you must
implement all subscripted reference explicitly [...]
这真的是唯一可行的解决方案吗?对于复杂的方法,这基本上意味着复制了很多逻辑。在我的情况下,这肯定是不可维护的(具有大量方法和属性的大型类)。
注意:我知道这完全是关于语法糖的,我总是可以使用标准方法调用而不是重载()
和{}
。
答案 0 :(得分:3)
对于部分修复,我认为你可以使用nargout来推迟调用者,调用者通常可以知道。任何捕获多个输出的函数必须在通话时知道它捕获了多少。
这不会让你在命令行显示多个argouts,但是只要你正在捕获返回的值,就像在大多数代码中一样。
function varargout = subsref(this, S)
switch S(1).type
...
case '.'
varargout = cell(1, nargout);
if nargout == 0
builtin('subsref', this, S);
else
[varargout{:}] = builtin('subsref', this, S);
end
end
end
警告:这段代码没有经过测试,在subsref / subsasgn内部有一堆挑剔的边缘情况。