【问题标题】:Variable Declaration with the Presence of Nested Functions存在嵌套函数的变量声明
【发布时间】:2014-05-13 13:15:47
【问题描述】:

几天前/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在运行时如何编译代码有关系吗?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    具有嵌套函数的函数的工作区受到保护。当函数被调用时,Matlab 必须分析代码以确定哪些变量在函数的哪个部分的范围内。请记住,在主函数中声明的变量和在嵌套函数中使用的变量是通过引用传递的,即使没有明确声明为输入或输出,也可以在嵌套函数中进行修改。

    为了避免弄乱任何嵌套函数,并可能有助于加快处理速度,Matlab 不允许将任何其他变量分配给该函数的工作区。例如,如果您在第 1 行停止执行代码,然后尝试为新变量 klmn 赋值,Matlab 将抛出错误。这对于调试来说可能有点令人沮丧,但幸运的是,您始终可以分配ans

    【讨论】:

    • 有意思,谢谢!经过更多的挖掘,我确实注意到function basics documentation 中有几句话关于所有需要出现在代码文本中的变量。我很想了解更多关于使用静态工作区背后的原因的信息,但我看到的搜索结果只是指出了有关此错误的问题。
    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多