为什么 Octave 不在嵌套函数中封装变量?
Why does Octave not encapsule variables inside of nested functions?
在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
这对我来说似乎很奇怪,因为它尖叫着寻找错误,对吧?这里没有封装变量是否有特定原因?
嵌套函数明确存在以与封闭函数共享变量。这是他们的目的。如果您不希望私有函数与调用函数共享变量,请在同一 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 中引入的。您应该阅读 the excellent MATLAB documentation 以了解更多信息。
在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
这对我来说似乎很奇怪,因为它尖叫着寻找错误,对吧?这里没有封装变量是否有特定原因?
嵌套函数明确存在以与封闭函数共享变量。这是他们的目的。如果您不希望私有函数与调用函数共享变量,请在同一 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 中引入的。您应该阅读 the excellent MATLAB documentation 以了解更多信息。