4

classB インスタンスである属性 attrA を持つ、classA のジェネリック subsref を作成しています。これまでのところ、機能しています。次のようなことができます

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 に答える