嵌套函数与子函数的相似之处在于,只有主函数在文件外部可见。然而,它们也允许子函数访问其父函数中的局部变量。这种共享访问模仿了一个全局变量来共享信息,但全局变量对Octave的其他部分不可见。作为一种编程策略,以这种方式共享数据可能会创建难以维护的代码。建议尽可能使用所有子函数来代替嵌套函数。
作为一个简单的例子,考虑一个父函数foo
,调用nestedchild函数bar
,具有共享变量x.
function y = foo () x = 10; bar (); y = x; function bar () x = 20; endfunction endfunction foo () ⇒ 20
请注意,共享没有特殊语法x。这可能导致父函数与其子函数之间意外共享变量的问题。虽然通常变量是继承的,但子函数的参数和返回值是子函数的局部值。
现在考虑函数foobar
使用变量x和y. foobar
调用嵌套函数foo
需要x作为参数并返回y. foo
然后调用bat
它进行一些计算。
function z = foobar () x = 0; y = 0; z = foo (5); z += x + y; function y = foo (x) y = x + bat (); function z = bat () z = x; endfunction endfunction endfunction foobar () ⇒ 10
需要注意的是x和y在里面foobar
remainzero,如foo
它们分别是返回值和参数。这里的x在里面bat
指的是x在里面foo
.
变量继承导致的问题eval
和脚本。如果在父函数中创建了新的变量,则不清楚嵌套的子函数中应该发生什么。例如,考虑一个父函数foo
具有嵌套的子函数bar
:
function y = foo (to_eval) bar (); eval (to_eval); function bar () eval ("x = 100;"); eval ("y = x;"); endfunction endfunction foo ("x = 5;") ⇒ error: can not add variable "x" to a static workspace foo ("y = 10;") ⇒ 10 foo ("") ⇒ 100
父函数foo
无法创建新变量x,但是子函数bar
是成功的。此外,即使在eval
语句y在里面bar
是一样的y如同在其父函数中一样foo
。的使用eval
最好避免与嵌套函数结合使用。
与子函数一样,只能从外部调用文件中的第一个嵌套函数。在函数内部,规则更为复数。一般来说,嵌套函数可以调用:
作为一个复数的例子,考虑一个父函数ex_top
具有两个子函数,ex_a
和ex_b
此外ex_a
具有另外两个子函数,ex_aa
和ex_ab
例如
function ex_top () ## Can call: ex_top, ex_a, and ex_b ## Can NOT call: ex_aa and ex_ab function ex_a () ## Can call everything function ex_aa () ## Can call everything endfunction function ex_ab () ## Can call everything endfunction endfunction function ex_b () ## Can call: ex_top, ex_a, and ex_b ## Can NOT call: ex_aa and ex_ab endfunction endfunction
版权所有 © 2024-2025 Octave中文网
ICP备案/许可证号:黑ICP备2024030411号-2