如何解决来自不同文件夹但名称相同的 Octave 上的函数重载?

How to solve function overloading on Octave from different folders but with the same name?

这里使用的命名如function1Rootclass1class2只是虚构的,在代码中并不存在。他们在这里只是为了掩盖他们的真实姓名,但是他们明确地代表了文件在文件系统上的处理方式以及文件的调用方式。

  1. 有名为 RootRoot/class1Root/class2 的文件夹。
  2. 有名为 Root/class1/function1.mRoot/class2/function1.m 的文件。
  3. 在这些文件中,分别有函数 function function1( A )function function1( A, B )

现在我在文件夹 Root/class2 运行 上有一个名为 system.m 的文件,我这样做:

addpath( '../class1' )
function1( A )

并尝试从文件Root/class2/function1.m调用函数function1( A, B),而不是从文件Root/class1调用函数function function1( A ),输出错误:

error: 'B' undefined near line 4 column 27

如何从文件 Root/class1/function1.m 调用函数 function function1( A ) 而 运行 文件夹 Root/class2 中的文件重载当前 "context" 中的函数?

我想调用另一个文件夹中的函数,但在那边,它与当前文件夹中的函数同名。

你没有给我们提供太多信息。这完全取决于您为什么要这样做,以及您是否是开发/使用此代码的人。

但一般来说,您应该将包含同名函数的文件夹添加到当前工作路径。而且你绝对应该 NOT 使用单词 "function" 作为函数的名称,因为这会掩盖 function 关键字并且一切都会崩溃。

这里有一些关于如何做你想做的事情的建议:


选项 1
例如,您可以将函数转换为静态 class 方法:

% in file class1.m:
classdef class1
  methods(Static)
    function myfunction(A)
      fprintf('Hello from class1: A is %d\n', A);
    end
  end
end

% in file class2.m
classdef class2
  methods(Static)
    function myfunction(A,B); 
      fprintf('Hello from class2: A is %d and B is %d\n', A, B);
    end
  end
end

% at the terminal:
>> class1.myfunction(5)
Hello from class1: A is 5
>> class2.myfunction(5, 3)
Hello from class2: A is 5 and B is 3


选项 2
或者,如果您只需要一个命名空间,您可以将 Root/class1/myfunction.m 重命名为 Root/+class1/myfunction.m。 "plus" 使该文件夹成为 "package",这意味着您可以这样做(从根文件夹):

class1.myfunction(5);
class2.myfunction(5,3);


选项 3
如果您 真的 必须使用文件夹等中的正常功能来执行此操作,那么不要将 "class1" 添加到路径中,而只需将 cd 添加到它,而是使用您的函数该目录,然后 cd 回到原来的位置。例如,假设您有一个包含文件 myfunction.m 的文件夹 Root/class1,以及包含文件 myfunction.mmyscript.m 的文件夹 Root/class2。然后在 myscript.m 你写:

% go to class1 directory to use the conflicting function
cd '../class1'
myfunction(5)

% come back to class2
cd '../class2'
myfunction(5, 3 )

但是,请注意这是最不推荐的方法!因为它可能会出错! (例如,如果其中一个函数更改目录或依赖于特定的文件夹结构等)