如何解决功能过载的Octave从不同的文件夹,但具有相同的名称



这里使用的function1, Root, class1class2的命名只是虚构的,在代码中不存在。它们在这里只是为了掩盖它们的真实名称,但是它们显式地表示文件在文件系统上的处置方式以及它们如何被调用。

  1. Root, Root/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中运行一个文件,在当前"上下文"内重载该函数?

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

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

但是一般来说,你应该而不是将包含同名函数的文件夹添加到当前工作路径中。而且你绝对应该不要使用"function"这个词作为函数的名字,因为它会掩盖function关键字,然后一切就乱了。

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


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

% in file class1.m:
classdef class1
  methods(Static)
    function myfunction(A)
      fprintf('Hello from class1: A is %dn', 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 %dn', 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。"+"使该文件夹成为一个"包",这意味着你可以这样做(从根文件夹):

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


选项3
如果您真的必须在文件夹等中使用正常函数这样做,那么不要将"class1"添加到路径中,而只是将cd添加到它,而是使用该目录中的函数,然后将cd返回到您所在的位置。例如,假设您有一个文件夹Root/class1,其中包含文件myfunction.m,文件夹Root/class2中包含文件myfunction.mmyscript.m。然后在myscript.m中你写:

% go to class1 directory to use the conflicting function
cd '../class1'
myfunction(5)
% come back to class2
cd '../class2'
myfunction(5, 3 )

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

最新更新