为什么 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 以了解更多信息。