関数呼び出しの結果へのインデックス付け
このトピックでは、関数呼び出しによって作成された一時変数にドット インデックスを付ける方法を説明します。"一時変数" は、関数呼び出しの結果が、大きな式で中間変数として使用される場合に作成されます。式内の関数呼び出しの結果が一時的であるのは、そこで作成される変数が短期間のみ存在し、実行後は MATLAB® ワークスペースに保存されないためです。例としては、式 myFunction(x).prop
があります。これは、引数 x
を指定して myFunction
を呼び出した後、結果の prop
プロパティを返します。任意のタイプの関数 (無名関数、ローカル関数、入れ子関数、またはプライベート関数) をこの方法で呼び出すことができます。
例
以下の関数を想定します。
function y = myStruct(x) y = struct("Afield",x); end
この関数は、Afield
という名前のフィールドを 1 つもつ構造体を作成し、そのフィールドに値を代入します。次のコマンドを使ってこの関数を呼び出し、値 1 を含むフィールドをもつ構造体を作成できます。
myStruct(1)
ans = struct with fields: Afield: 1
しかし、フィールド値を直接返す場合は、次のコマンドを使って関数呼び出しの結果にインデックスを付けることができます。
myStruct(1).Afield
ans = 1
このコマンドの実行後、コマンド myStruct(1)
によって作成された一時構造体は存在しなくなり、MATLAB はフィールド値のみを返します。概念的にこの使用法は、構造体を作成し、インデックスを付け、その後削除することと同じです。
S = struct("Afield",1); S.Afield clear S
サポートされる構文
MATLAB は、foo(arg).prop
のような、関数呼び出しの結果に対するドット インデックスをサポートしています。関数呼び出しの結果に対する他の形式のインデックス付け (小かっこを使用した foo(arg)(2)
や、中かっこを使用した foo(arg){2}
など) はサポートされていません。コマンドが成功するには、以下の条件を満たしていなければなりません。
foo(arg1,arg2,...)
のように、小かっこを使用して関数が呼び出されている。関数は、ドット インデックスが定義されている変数 (構造体、table、オブジェクトなど) を返す。
ドット インデックスの添字が有効である。
MATLAB は、ドット インデックスの定義されていない変数が関数から返される場合でも、常に一時変数にドット インデックス演算を適用しようとします。たとえば、magic(3)
で作成された行列にインデックスを付けようとすると、エラーが返されます。
magic(3).field
Dot indexing is not supported for variables of this type.
一時変数に対するインデックス付けが引き続き可能であるなら、インデックス付けのコマンドを式の最後にさらに追加することができます。たとえば、次の式を考えます。
table(rand(10,2)).Var1(3,:)
table(rand(10,2))
は、Var1
という名前の変数を 1 つもつ table を作成する。変数には 10 行 2 列の行列が含まれます。table(rand(10,2)).Var1
はVar1
に含まれる 10 行 2 列の行列を返す。table(rand(10,2)).Var1(3,:)
はVar1
に含まれる行列の 3 行目を返す。