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

MWE可以如下或download it as a .zip file here进行。

在路径中创建一个带有以下四个功能文件的软件包文件夹+test:

+test
    a.m
    b.m
    c.m
    d.m
a.m的内容:
function a
disp 'Hello World!'
b.m的内容:
function b
a

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

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

现在运行c可以正常工作。

现在我的问题。如果我将c.m更改为(保存在d.m中):
function d
a
import test.*

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

为什么会这样。这是预期的行为,它的用途是什么? MATLAB如何以什么顺序读取.m文件并对其进行处理?还有更多的话题,但总的来说:与MATLAB相比,导入以不同语言处理的包的方式如何?命令的顺序重要吗?

基于这些评论,我得出了先发制人的结论:最好的做法是,仅在MATLAB代码开头或开头附近使用import函数。这样可以清楚地看到导入的内容在整个元素(例如函数)中都可用。它还可以防止错误的假设,即在导入之前,内容尚不可用或引用了具有相同名称的其他事物。

最佳答案

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

您可以通过查看import的输出轻松地进行测试,该输出将列出所有当前导入的软件包。

+test/a.m

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

test.a()

%   test.*

这就是the documentation states不在条件中放入import语句的原因。


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

test.a()

%   test.*
%   othertest.*

避免此行为的唯一方法是允许静态代码分析器确定(毫无疑问)将不执行import语句。我们可以通过使我们的条件语句只是一个逻辑值来做到这一点。
function a()
    disp(import)
    if true
        import test.*
    else
        import othertest.*
    end
end

test.a()

%   test.*

与其他语言相比,导入实际上取决于语言。例如,在Python中,必须先将import放置在访问模块内容之前。以我的经验,这是典型的情况,但是我敢肯定会有很多异常(exception)。每种语言都会有所不同。

关于matlab - 为什么要在函数中使用其内容*之后*导入软件包?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37386754/

10-12 17:56
查看更多