我正在为classA创建一个通用subsref,它有一个属性attrA,它是一个classB实例。 到目前为止,它正在工作,它让我做像
这样的事情x = objA.attr1.methB(),
这是我首先要做的事情。
function this = Class1(varargin)
this.attrA = ClassB()
this = class(this,'ClassA')
function this = ClassB()
this.AttrB1 = 'valueB1'
this.AttrB2 = 'valueB2'
function out = methB
out = this.AttrB2
我偶然发现的问题是: 当在我的subsref中执行对方法的调用时,我这样做(检测到它是以前完成的方法等):
methName = index(1).subs;
args = index(2).subs;
if iscell(args)
varargout = {feval(methName,this,args{:})};
else
varargout = {feval(methName,this,args)};
end %end if iscell
问题是当methName方法支持可变数量的输出时,此varargout不等同于[x,y,...](输出的数量应该在调用subsref时分配,因此methName总是返回单个输出,这并不总是我想要的(几乎,但并非总是如此)。
我如何让methName知道我想要多少输出? (我不想将N作为参数传递)。
我正在考虑创建一个字符串str='[out1,out2,out3...]'
然后做类似
eval([
str ...
'= {feval(methName,this,args{:})};'...
])
但我一直认为必须有一种更优雅的方式。
答案 0 :(得分:3)
如果您期望的输出数量取决于您的subsref请求的输出参数,您可以像这样使用nargout
:
[varargout{1:nargout}] = feval(methName,this,args{:});
答案 1 :(得分:0)
这个解决方案有效,但我需要为单个输出添加一些内容:
if iscell(args)
[argout{:}] = feval(methName,this,args{:});
else
[argout{:}]= {feval(methName,this,args)};
end %end if iscell`
if isSingleCell(argout) && iscell(argout{1})`
v = argout{1};
argout{1}=v{1};
end
我不确定,但可能最后一点只是修复别的东西所必需的(我必须修复很多其他东西来使这项工作)。当我完成我试图用这个课程做的事情时,我会回到它。