Matlab中的作用域如何工作?

seb*_*fer 12 matlab scope

我刚刚发现(令我惊讶)调用以下函数

function foo()
if false
   fprintf = 1;
else
  % do nothing
end
fprintf('test')
Run Code Online (Sandbox Code Playgroud)

给出和错误Undefined function or variable "fprintf".我的结论是变量的范围是在运行之前确定的(在我有限的理解中如何解释计算机语言,特别是Matlab的工作原理).有人能给我一些背景信息吗?

编辑

我上面忘记提到的另一个有趣的事情是

function foo()
if false
   fprintf = 1;
else
  % do nothing
end
clear('fprintf')
fprintf('test')
Run Code Online (Sandbox Code Playgroud)

生产Reference to a cleared variable fprintf.

Pra*_*ian 8

看来,第一次MATLAB JIT编译器解析M文件,它确定的函数声明的所有变量.它似乎并不关心是否在无法访问的代码中声明了所述变量.因此,您的局部fprintf变量会立即隐藏内置函数fprintf.这意味着,就此函数而言,没有名为内置函数fprintf.

当然,一旦发生这种情况,函数中的每个引用都引用fprintf局部变量,并且由于变量从未实际创建过,因此尝试访问它会导致错误.

清除变量只是清除局部变量(如果存在),它不会将内置函数带回范围.

要显式调用内置函数,可以使用该builtin函数.

builtin( 'fprintf', 'test' );
Run Code Online (Sandbox Code Playgroud)

上面的行将始终在MATLAB命令行中打印文本,而不管可能影响fprintf函数的局部变量.


Bre*_*son 8

MATLAB在运行之前解析该函数​​.例如,它会查找变量名称,而不管激活(或不激活)这些变量的分支.也就是说,范围不是在运行时确定的.

附录:我不建议这样做,但我看到很多人用MATLAB做事我不推荐.但是......考虑如果有人要定义他们自己的称为"假"的函数会发生什么.运行前解析器无法知道调用该函数会发生什么.