私はこのようなことをしたいと思います:
>> foo = @() functionCall1() functionCall2()
だから私が言ったとき:
>> foo()
実行functionCall1()
してから実行しfunctionCall2()
ます。( C , 演算子のようなものが必要だと感じています)
編集:
functionCall1
functionCall2
必ずしも値を返す関数ではありません。
私はこのようなことをしたいと思います:
>> foo = @() functionCall1() functionCall2()
だから私が言ったとき:
>> foo()
実行functionCall1()
してから実行しfunctionCall2()
ます。( C , 演算子のようなものが必要だと感じています)
編集:
functionCall1
functionCall2
必ずしも値を返す関数ではありません。
関数を m ファイルに保存せずにコマンド ラインからすべてを実行しようとするのは、複雑で厄介な作業になる可能性がありますが、私が思いついた 1 つの方法を次に示します...
まず、無名関数を作成し、そのハンドルをcell 配列に入れます。
fcn1 = @() ...;
fcn2 = @() ...;
fcn3 = @() ...;
fcnArray = {fcn1 fcn2 fcn3};
...または、(m ファイルのように) 関数が既に定義されている場合は、次のように関数ハンドルを cell 配列に配置します。
fcnArray = {@fcn1 @fcn2 @fcn3};
cellfun
次に、組み込み関数とを使用して、配列内の各関数を呼び出す新しい無名関数を作成できますfeval
。
foo = @() cellfun(@feval,fcnArray);
変な見た目ですが、機能します。
編集:関数fcnArray
を入力引数で呼び出す必要がある場合は、最初に、配列内のすべての関数が同じ数の入力を必要とすることを確認する必要があります。その場合、次の例は、関数の配列をそれぞれ 1 つの入力引数で呼び出す方法を示しています。
foo = @(x) cellfun(@feval,fcnArray,x);
inArgs = {1 'a' [1 2 3]};
foo(inArgs); %# Passes 1 to fcn1, 'a' to fcn2, and [1 2 3] to fcn3
警告の言葉:のドキュメントにcellfun
は、出力要素が計算される順序が指定されておらず、依存すべきではないと記載されています。これは、またはのfcn1
前に評価される保証がないことを意味します。順序が重要な場合、上記の解決策は使用しないでください。fcn2
fcn3
これは、実行順序を保証するメソッドであり、(最後に変更が記載されています) さまざまな引数をさまざまな関数に渡すことができます。
call1 = @(a,b) a();
call12 = @(a,b) call1(b,call1(a,b));
重要なのはcall1
、最初の引数を呼び出し、2 番目の引数を無視することです。call12
最初の引数を呼び出してから 2 番目の引数を呼び出し、2 番目の引数から値を返します。関数は引数の前に評価できないため、機能します。例を作成するには、次のように記述します。
foo = @() call12(functionCall1, functionCall2);
テストコード
使用したテストコードは次のとおりです。
>> print1=@()fprintf('1\n');
>> print2=@()fprintf('2\n');
>> call12(print1,print2)
1
2
より多くの関数を呼び出す
3 つの関数を呼び出すには、次のように記述できます。
call1(print3, call1(print2, call1(print1,print2)));
4つの機能:
call1(print4, call1(print3, call1(print2, call1(print1,print2))));
より多くの関数については、ネスト パターンを続けます。
引数を渡す
引数を渡す必要がある場合は、call1
引数を取るバージョンの を作成してから、 に明らかな変更を加えることができcall12
ます。
call1arg1 = @(a,arg_a,b) a(arg_a);
call12arg1 = @(a, arg_a, b, arg_b) call1arg1(b, arg_b, call1arg1(a, arg_a, b))
複数の引数を取り、必要に応じてそれらを組み合わせて一致させるバージョンの call1 を作成することもできます。
コンマ区切りリストの作成に使用されるcurly関数を使用して可能です。
curly = @(x, varargin) x{varargin{:}};
f=@(x)curly({exp(x),log(x)})
[a,b]=f(2)
そして何かfunctionCall1()
をfunctionCall2()
返し、それらの何かを連結できる場合、これを行うことができます:
>> foo = @() [functionCall1(), functionCall2()]
また
>> foo = @() [functionCall1(); functionCall2()]
これの副作用はfoo()
、何でも連結してfunctionCall1()
返すfunctionCall2()
ことです。
functionCall1()
andの実行順序functionCall2()
が保証されているかどうかはわかりません。