4

我正在为我的 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{:})};'...
])

但我一直认为必须有一种更优雅的方式来做到这一点。

4

2 回答 2

4

如果您期望的输出数量取决于从您的 subsref 请求的输出参数,您可以nargout像这样简单地使用:

[varargout{1:nargout}] = feval(methName,this,args{:});
于 2013-01-23T12:42:55.503 回答
1

该解决方案有效,但我需要为单个输出添加一些内容:

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

我不确定,但可能最后一点只需要修复其他东西(我必须修复很多其他东西才能完成这项工作)。当我完成我在这门课上尝试做的事情时,我会回到它

于 2013-01-24T15:37:43.867 回答