【发布时间】:2016-09-20 02:00:53
【问题描述】:
我在使用 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.*
即在调用包函数a 之后 发出导入命令。运行d 仍然可以正常工作,好像导入命令在d.m 中的位置无关紧要。导入似乎发生在对函数 a 的调用之前,而 d.m 中的函数调用发生在导入之前的那一行。
为什么会这样。这是预期的行为吗?它的用途是什么? MATLAB 如何以及以什么顺序读取.m 文件并对其进行处理?还有更多离题,但总的来说:与 MATLAB 相比,导入不同语言的包如何处理,命令的顺序重要吗?
我基于 cmets 的先发制人的结论:最好只在 MATLAB 代码的开头或附近使用导入函数。这使得导入的内容在整个元素(例如函数)中都清晰可见。它还可以防止错误的假设,即在导入之前,内容尚不可用或引用了具有相同名称的不同事物。
【问题讨论】:
-
@thewaywewalk 我确定这不是我的误解。在编辑
b.m之前,我对导入的包非常小心。在我采取任何步骤之前,我使用了clear all、clear classes和clear import,但是从import上的文档来看,这不是必需的:每个函数都有自己的工作区和导入列表(你可以用@检查这个987654352@)。即使主 MATLAB 工作区已导入包,它也不会传递给您从命令行调用的任何函数。注意:脚本在调用它们的工作区中工作,因此它们从那里继承导入列表。 -
我已经编辑了这个问题。现在
b.m没有更改,而是添加了两个文件c.m和d.m。我还为那些想自己尝试的人添加了 MWE 作为 .zip 文件。函数d.m现在是具有有趣行为的函数。 -
我现在明白你的问题了。虽然我没有答案,但导入命令似乎在调用其他任何内容之前已经过预处理。文档说 不要在函数内的条件语句中使用 import。 MATLAB 在计算条件语句中的变量之前预处理 import 语句。.
-
@thewaywewalk 我认为这应该是一个答案。
-
@Bernhard 答案有点弱。
标签: matlab import package packages