/r/matlab上有人在几天前向我提出了一个与提交给MATLAB FEX的Flappy Bird clone相关的非常有趣的问题。海报注意到,如果您打开主.m
文件,在第一行的调试器中停止它,并运行whos()
,您会在函数明确定义之前看到一堆变量。
我在编辑器中注意到的第一件事是语法高亮显示嵌套函数的存在。乍看之下,whos()
返回的变量似乎只是那些将在基函数范围内的某个点定义的变量。
您可以使用更简单的示例重新创建此内容:
function testcode
asdf = 1;
function testing
ghfj = 2;
end
end
如果您在第一行设置断点并运行whos()
,则会获得
Name Size Bytes Class Attributes
ans 0x0 0 (unassigned)
asdf 0x0 0 (unassigned)
我似乎无法在嵌套函数或相关主题的文档中找到解释此行为的任何内容。我不是计算机科学家,我的编程知识仅限于MATLAB和一小部分Python。谁能解释一下发生了什么?它与MATLAB如何在运行时编译代码有关吗?
答案 0 :(得分:1)
具有嵌套功能的函数的工作空间受到保护。当调用该函数时,Matlab必须分析代码以确定哪些变量在函数的哪个部分的范围内。请记住,在main函数中声明并在嵌套函数中使用的变量通过引用传递,并且可以在嵌套函数中修改,即使未明确声明为输入或输出。
为了避免弄乱任何嵌套函数,并可能帮助加快速度,Matlab不允许将任何其他变量分配给该函数的工作区。例如,如果您在第1行停止执行代码,然后尝试为新变量klmn
分配值,则Matlab将抛出错误。这对于调试来说可能有点令人沮丧,但幸运的是,您总是可以分配ans
。