我在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/