2

我正在尝试将一些用 Matlab 编写的代码变成一个独立的、已编译的 Matlab 应用程序。但是,在遇到一些奇怪的错误之后,我意识到代码大量使用从路径中添加和删除来解决有多个具有相同名称(但结果/计算不同)的函数多次使用的事实。环顾四周,我发现您可以通过在文件夹名称前加上“+”来将文件夹转换为包,然后检查并确保该包中的函数使用name_of_folder.name_of_function. 这解决了命名空间问题,但它可能会产生大量工作,因为我现在必须检查并为每个函数调用添加正确的包(我最终可能仍不得不复制大量文件)。

然后我看到了这个import功能,我希望这能节省我一些时间。我想我可以将我想要的包传递给一个或两个特定函数,让这些函数导入包,然后事情就会按照我想要的方式工作——如果这些函数调用的函数属于该导入语句的范围。例如,如果我设置类似

function foo(var1, var2, ..., packagename)
  eval(sprintf('import %s.*', packagename));
  ...
  bar1(var1, var2);
  ...
  bar2(var2);
  ...

那么我希望bar1并将bar2使用通过 import 语句导入的包。该文档说条件和函数中的导入语句仅限于该代码块,但我不知道“该代码块”是否仅表示文本,或者“该代码块”是代码和评估的所有内容因此。我有一种感觉是前者,但我想我会问,希望是后者。

那么,导入语句的范围是什么?或者,是否有另一种方法来处理这个问题?

4

2 回答 2

2

对您来说最好的方法可能是承担重命名的痛苦,直到“同名的多个函数”问题消失。这将使您和未来的维护者更容易理解代码。

与您的包装理念不同的两个选项(我喜欢):

  1. 您可以将目录名称附加(或前置)到函数名称,然后将它们全部放入一个新的(名称更好的)目录中。可能更有意义,视情况而定。

  2. 如果您foo在目录bar和中定义了两个函数car,并且两个函数都采用相同的参数,则可以将它们统一在一个采用barcar作为附加参数的函数中:

    function foo(parm1, parm2, parm3, version)
    if strcmp(version, 'bar')
        // bar code
    else
        // car code
    end
    

    这不是很好,但它比修改路径要好得多,并且它有点遵循 MATLAB 模式(传入字符串参数以更改函数的详细行为)。即使这两个foo函数有不同的参数,您也可以完成这项工作,但是您必须对参数进行烦人的解析,此时您的打包想法对我来说看起来要容易得多。

于 2012-10-25T21:38:34.003 回答
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'),我看到窗口中显示“I'm in the original folder :(”,同时trial.nested_function()给了我希望看到的字符串。

此外,该eval函数给编译器带来了问题,用它替换它import(sprintf('%s.*', package_name));似乎也无济于事。所以看起来我又开始复制文件了。

于 2012-10-25T20:19:50.120 回答