2016-11-17 6 views
3

私は、次のコードをW /又はO/W異なる動作見出さ関数入力を使用せずに関数入力を取得できません。

classdef TimerManager < handle 

methods (Access = private) 
    function obj = TimerManager() 
    end 
end 

methods (Static) 
    function singleObj = getInstance(varargin) 
     varargin{1} 
     singleObj = TimerManager(); 
    end 
end 

methods 
    function foo(obj) 
    end 

end 

end 

を次のクラスを定義して、 これは予想されますか?もし私が何かを見逃したら?

>> TimerManager.getInstance(0).foo() 

ans = 

0 

>> TimerManager.getInstance(0).foo(); 
Index exceeds matrix dimensions. 

Error in TimerManager.getInstance (line 13) 
     varargin{1} 

サイドgetInstanceにnarginを使用すると、配置すると0になります。最後に。

+0

興味深いことに、Octave v4.0.3(Ubuntu)で動作します。 – stephematician

+0

両方のシナリオでエラーが発生します。 MATLABのどのバージョン?また、 'foo'は決して値を返すべきではありません。どのように' 0'を得ていますか? – Suever

答えて

3

エラーはセミコロンとは関係ありません。これは、MATLABがオブジェクトの添え字付き参照を処理する方法(subsref)と関係があります。

MATLABで(詳細)問題

、あなたは "鎖" 参照添字することはできません。我々は、セルアレイを作成した場合、例えば、我々はすぐに第1の一時変数に代入せずに、このセルアレイへのインデックスができない。

X1 = {'X1', 'X2', 'X3'}{1} 

Error: Unbalanced or unexpected parenthesis or bracket.

同じオブジェクトのプロパティまたはメソッドにアクセスするための適用しますこれは関数によって返されます。あなたの場合、TimerManager.getInstanceは、fooメソッドにアクセスするには、最初に一時変数に割り当てる必要があるインスタンスを返します。

instance = TimerManager.getInstance(0); 
fooResult = instance.foo(); 

そして、MATLABは、それはあなたが一緒に「チェーン」にこれらの添字の参照をしようとしていることを考えて、エラーまたは警告をスローしようとする試みになりますが、添字操作の順序が有効であるシナリオがある場合、適切なエラーをスローすることはできません。あなたはそのようなケースの1つを経験しています。

使用している構文は、次のようなものです:a.bは関数ハンドルですdの分野でstructsの配列である場合

a.b(c).d() 

これは有効です。この場合、cインデックスです。

a.bの値を取得すると、cが正の整数(有効なインデックス)で、配列a.bの境界内にあることを確認します。それが確認されると、MATLABはdフィールドにアクセスし、それを呼び出します。

コードにもう一度戻ると、varargin{1}行をコメント化してより便利なエラーメッセージが表示されます。

TimerManager.getInstance(0).foo(); 

Subscript indices must either be real positive integers or logicals.

は、[OK]をので、その種のMATLABはstruct配列としてTimerManager.getInstanceを治療し、エラーで明らかに無効と結果である0でそれにインデックスにしようとしている、理にかなっています。あなたは、私が想定しstructアレイ上添字参照を適用する前に、MATLABは最初TimerManager.getInstanceの現在の値を取得する必要があることを言った上で、ノートを報告実際エラーに関して

。 MATLABはこれがちょうどstruct配列だと考えているので、入力引数を渡すことはなく、vararginが空になり、表示されているエラーが発生します。

だからあなたの文は機能的に同じである:これは返さTimerManagerインスタンスの1 x 1配列に有効な指標であるため、getInstanceへの「入力」1であれば、この作業を行うこと

instance = TimerManager.getInstance;  % No input arguments 
instance(0).foo()       % Indexing error 

注意入力なしのTimermanager.getInstanceに電話をしたとき。

TimerManager.getInstance(1).foo(); 

潜在的なソリューション

instance = TimerManager.getInstance(0); 
fooResult = instance.foo(); 

かの方法ではなく、obj.method()表記を呼び出すためのmethod(obj)表記を使用し、一時的な変数を使用してください。オクターブ

foo(TimerManager.getInstance(0)) 

注意、それは一時的な変数を必要とせずに一緒にこれらの添字の参照を「チェーン化」ができますので、これのどれもオクターブでは問題になるだろうされていません。

+0

MATLABのパーサは各IDの意味を理解していないと聞こえますが...これは言語を解釈するだけで言語はコンパイルしないためです。 Octaveはどのように問題を解決しますか? Octaveはコードをコンパイルしますか? –

関連する問題