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