为什么可以在*之后使用函数中的内容导入包*?

Eri*_*rik 7 import matlab packages package

我在MATLAB R2014b上,有一个问题,我将通过以下示例说明.

MWE可以如下制作或在此处下载为.zip文件.

+test在路径上创建一个包文件夹,其中包含四个函数文件:

+test
    a.m
    b.m
    c.m
    d.m
Run Code Online (Sandbox Code Playgroud)

内容a.m:

function a
disp 'Hello World!'
Run Code Online (Sandbox Code Playgroud)

内容b.m:

function b
a
Run Code Online (Sandbox Code Playgroud)

如果从命令行运行b,则必须先导入test包(import test.*)或运行test.b.

运行b将导致错误,因为函数的范围b不包含函数a.我们必须先导入它才能使用它.为此,我创造了c.m:

function c
import test.*
a
Run Code Online (Sandbox Code Playgroud)

现在运行c正常.

现在我的问题.如果我c.m改为(保存在d.m):

function d
a
import test.*
Run Code Online (Sandbox Code Playgroud)

即在调用package函数之后发出import命令a.运行d仍然可以正常工作,就好像导入命令的位置d.m无关紧要.导入似乎在调用函数之前发生a,这在d.m导入之前的行上发生.

为什么会这样呢?这是预期的行为,它的用途是什么?MATLAB如何以及以何种顺序读取.m文件并对其进行处理?更偏离主题,但总的来说:与MATLAB相比,如何导入以不同语言处理的包,命令的顺序是否重要?

我基于注释的先发制人的结论:最好只在MATLAB代码开头或附近使用导入函数.这清楚地显示了导入的内容在整个元素中可用(例如,功能).它还可以防止错误的假设,即在导入之前,内容尚未可用或引用具有相同名称的其他内容.

Sue*_*ver 4

MATLAB 在评估函数之前执行静态代码分析,以确定该函数使用的变量/函数。语句的评估import是静态代码分析的一部分。这是设计使然,因为如果您import打包然后使用它的函数,MATLAB 需要在静态代码分析期间知道这一点。因此,无论您将语句放在函数中的什么位置import,它都将具有与将其放在函数开头相同的效果。

您可以通过查看输出来轻松测试这一点,输出import将列出所有当前导入的包。

+test/a.m

function a(x)
    disp(import)
    import test.*
end

test.a()

%   test.*
Run Code Online (Sandbox Code Playgroud)

这就是为什么文档指出不要语句放在import条件中的原因。

不要import在函数内的条件语句中使用。MATLABimport在计算条件语句中的变量之前对语句进行预处理。

function a(x)
    disp(import)
    if x
        import test.*
    else
        import othertest.*
    end
end

test.a()

%   test.*
%   othertest.*
Run Code Online (Sandbox Code Playgroud)

避免这种行为的唯一方法是允许静态代码分析器确定(毫无疑问)语句import不会被执行。我们可以通过让条件语句只是一个逻辑值来做到这一点。

function a()
    disp(import)
    if true
        import test.*
    else
        import othertest.*
    end
end

test.a()

%   test.*
Run Code Online (Sandbox Code Playgroud)

就与其他语言相比的导入而言,这实际上取决于语言。例如,在 Python 中,您必须在访问模块内容import 之前放置 。根据我的经验,这是典型的情况,但我确信还有很多例外。每种语言都会有所不同。