6

実験として (ユーザー データから無名関数を生成しているため)、次の MATLAB コードを実行しました。

h = @(x) x * x
    h = @(x) x * x
h(3)
    ans = 9
h = @(x) h(x) + 1
    h = @(x)h(x)+1
h(3)
    ans = 10

基本的に、無名関数呼び出し自体を作成しました。再帰的に動作する代わりに、MATLAB は古い関数定義を記憶しました。ただし、ワークスペースはそれを変数の 1 つとして表示せず、ハンドルもそれを認識していないようです。

新しい関数を保持している限り、古い関数はバックグラウンドで保存されますか? この種の構造に「落とし穴」はありますか?

4

1 に答える 1

8

匿名関数は、定義時にワークスペースの関連部分を記憶し、そのコピーを作成します。したがって、無名関数の定義に変数を含め、後でその変数を変更すると、無名関数内に古い値が保持されます。

>> a=1;
>> h=@(x)x+a %# define an anonymous function
h = 
    @(x)x+a
>> h(1)
ans =
     2
>> a=2 %# change the variable
a =
     2
>> h(1)
ans =
     2 %# the anonymous function does not change
>> g = @()length(whos)
g = 
    @()length(whos)
>> g()
ans =
     0 %# the workspace copy of the anonymous function is empty
>> g = @()length(whos)+a
g = 
    @()length(whos)+a
>> g()
ans =
     3 %# now, there is something in the workspace (a is 2)
>> g = @()length(whos)+a*0
g = 
    @()length(whos)+a*0
>> g()
ans =
     1 %# matlab doesn't care whether it is necessary to remember the variable
>> 
于 2012-06-26T18:48:07.500 に答える