2013-01-23 79 views
3

我爲我的classA製作了一個通用的子參考,它具有屬於classB實例的屬性attrA。 到目前爲止,它的工作,它讓我做的事情一樣在分配可變參數時使用可變數量的輸出

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方法支持可變數量的輸出時,這個變量不等於[x,y,...](在調用subsref時應該分配輸出的數量,所以methName總是返回一個單一的輸出,這並不總是我想要的(幾乎,但並非總是)

我如何讓methName知道我需要多少輸出? (我不想通過N作爲參數)。

我想這樣創建一個字符串str='[out1,out2,out3...]' ,然後做一些像

eval([ 
str ... 
'= {feval(methName,this,args{:})};'... 
]) 

但我一直在想,必須有這樣做的更優雅的方式。

+3

'[output {1:n}] = {feval(methName,this,args {:})};'with 'n'是你期望的產出數量? –

回答

3

如果你希望輸出的數量取決於您的subsref要求的輸出參數,你可以簡單地使用nargout這樣的:

[varargout{1:nargout}] = feval(methName,this,args{:}); 
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 

我不知道,但它可能是最後一位是隻需要解決其他的東西(我不得不修復了很多其他的事情,使這項工作)。當我完成我正在嘗試處理的課程時,我會回頭看看