在 Octave 中撰寫嵌套函式時,變數似乎沒有被封裝:
function r = asd()
fn1();
endfunction
function res1 = fn1()
res1 = 0;
function res2 = fn2()
res2 = 0;
for i = 10:20
res2 = res2 i;
endfor
endfunction
for i = 1:10
printf("i before calling fn2(): %d\n", i);
res1 = res1 fn2();
printf("i after calling fn2(): %d\n", i);
endfor
endfunction
這對我來說似乎很奇怪,因為它為錯誤尖叫,對吧?這里沒有封裝變數是否有特定原因?
uj5u.com熱心網友回復:
嵌套函式顯式存在以與封閉函式共享變數。這是他們的目的。如果您不希望私有函式與呼叫函式共享變數,請在同一個 M 檔案中的呼叫函式之后宣告它。這使它成為一個“本地函式”,一個只能在這個檔案中可見的函式。
一般來說,嵌套函式很奇怪,應該只在特定情況下使用。它們有用的一個地方是將變數封裝在一個比匿名函式更復雜的 lambda 中:
% Returns a function that depends on x
function f = createLambda(x)
y = atan(x); % some calculation
function res = nested(val)
res = y * val; % …but this would be several lines or a loop or whatever
end
f = @nested
end
Octave 中存在嵌套函式,因為它們是在 MATLAB 中引入的。您應該閱讀優秀的 MATLAB 檔案以了解有關它們的更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358066.html
上一篇:匯入類函式變數
