我正在尝试将一些用Matlab编写的代码转换为一个独立的,编译好的Matlab应用程序。然而,在得到一些奇怪的错误后,我意识到代码大量使用添加和删除路径来解决这个事实,即有多个函数具有相同的名称(但不同的结果/计算)多次使用。环顾四周,我发现您可以通过在其名称前加上“+”将文件夹转换为包,并通过并确保该包中的函数使用name_of_folder.name_of_function
相互引用。这解决了命名空间问题,但它可能会产生很多工作,因为我现在必须经历并为每个函数调用添加正确的包(我可能仍然需要复制大量文件)。
然后我看到了import
函数,我希望能节省一些时间。我想我可以将我想要的包传递给一个或两个特定的函数,让这些函数导入包,然后事情将按照我想要的方式工作 - 如果这些函数调用的函数属于该import语句的范围。例如,如果我设置了像
function foo(var1, var2, ..., packagename)
eval(sprintf('import %s.*', packagename));
...
bar1(var1, var2);
...
bar2(var2);
...
然后我希望bar1
和bar2
将使用随import语句导入的包。文档说条件和函数中的import语句仅限于那个代码块,但我不知道“那个代码块”是指仅文本,还是“那个代码块”是代码和评估的所有内容结果是。我觉得这是前者,但我想我会希望它是后者。
那么,import语句的范围是什么?或者,还有另一种方法可以解决这个问题吗?
答案 0 :(得分:2)
对您而言,最好的方法可能是重命名,直到“具有相同名称的多个功能”问题消失为止。它将使您和未来的维护者更容易理解代码。
两个与您的包装理念不同的选项(我喜欢):
您可以将目录名称附加(或预先添加)到函数名称,并将它们全部放入新的(更好命名的)目录中。根据具体情况,可能会更有意义。
如果在目录foo
和bar
中定义了两个函数car
,并且两个函数都使用相同的参数,则可以在单个函数中统一它们{ {1}}或bar
作为附加参数:
car
这不是很好,但它比修改路径要好得多,而且它遵循MATLAB模式(传入一个字符串参数来改变函数的详细行为)。即使两个function foo(parm1, parm2, parm3, version)
if strcmp(version, 'bar')
// bar code
else
// car code
end
函数具有不同的参数,您也可以使其工作,但是您必须对参数进行烦人的解析,此时您的包装想法对我来说更容易。
答案 1 :(得分:1)
我写了一些测试代码来为自己试一试,实际上,import语句仅限于调用它的函数,这是有道理的,但我想我的希望使我的判断蒙上阴影。为了记录,我编写了以下简短函数来测试它:
function package_test(package_name)
eval(sprintf('import %s.*;', package_name));
test_function();
end
function test_function()
nested_function()
end
然后把
function nested_function()
disp('I\'m in the original folder :(');
end
与前两个函数位于同一文件夹中,
function nested_function()
disp('I\'m in the package! :)');
end
在名为+trial
的文件夹中。当然,当我跑package_test('trial')
时,我看到“我在原始文件夹中:(”显示在窗口中,而trial.nested_function()
给了我希望看到的字符串。
此外,eval
函数给编译器带来了问题,用import(sprintf('%s.*', package_name));
替换它似乎也没有帮助。所以看起来我回到了复制文件。