エラーはセミコロンとは関係ありません。これは、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))
注意、それは一時的な変数を必要とせずに一緒にこれらの添字の参照を「チェーン化」ができますので、これのどれもオクターブでは問題になるだろうされていません。
興味深いことに、Octave v4.0.3(Ubuntu)で動作します。 – stephematician
両方のシナリオでエラーが発生します。 MATLABのどのバージョン?また、 'foo'は決して値を返すべきではありません。どのように' 0'を得ていますか? – Suever