Matlab:不能将类方法作为普通函数运行吗?

时间:2018-04-09 19:31:00

标签: matlab class oop methods

我已经定义了一个类cMyClass,并在SomeMethod.m文件夹中将方法作为单独的m文件@cMyClass。只要将SomeMethod复制到文件夹@cMyClass之外,我就可以将@cMyClass作为普通函数(而不是方法)调用。但是,当前工作目录是文件夹SomeMethod时,无法识别clear classes(我提供一个空结构作为参数来代替预期的主机对象)。我在将文件夹更改为rehash后尝试了@cMyClass@cMyClass/cMyClass.m,但他们没有帮助。

这为战术测试和故障排除带来了便利。我想知道这样的行为是否真的被硬编码到Matlab中,还是有些东西我不知道?测试代码如下。

班级定义% @cMyClass/cMyClass.m % -------------------- classdef cMyClass < handle methods SomeMethod(o) end % methods end % classdef

@cMyClass/SomeMethod.m

% @cMyClass/SomeMethod.m % ---------------------- function SomeMethod(o) 'Hello world' end % function 中的方法定义:

SomeMethod

我成功地将>> oMyClass = cMyClass oMyClass = cMyClass with no properties. >> oMyClass.SomeMethod ans = Hello world 作为一种类方法调用:

SomeMethod

不幸的是,我无法使用文件夹@cMyClass调用>> cd @cMyClass >> clear all; clear classes >> rehash >> o=struct o = struct with no fields. >> SomeMethod(o) Undefined function or variable 'SomeMethod'. 作为正常函数:

SomeMethod

但是,我成功地从@cMyClass之外调用了@cMyClass/..。我使用shell将SomeMethod.m向上复制到>> cd .. % Go to @cMyClass/.. >> clear all; clear classes >> rehash >> o=struct o = struct with no fields. >> SomeMethod(o) ans = Hello world (在POSIX路径表示法中),然后执行:

@

当函数未驻留在以@cMyClass开头的文件夹中时,另一个成功示例是将not_cMyClass复制到>> cd not_cMyClass > clear all; clear classes >> rehash >> o=struct o = struct with no fields. >> SomeMethod(o) ans = Hello world 并执行:

@cMyClass

令人费解的是,当Matlab的当前工作目录为cMyClass时,>> cd ..\@cMyClass\ >> clear all >> clear classes >> rehash >> c=cMyClass Undefined function or variable 'cMyClass'. 不会被识别为类,因此SomeMethod.m不应被解释为方法文件:

SomeMethod.m

换句话说,人们希望not_cMyClass被解释为正常的函数文件,就像它位于@cMyClass/..SomeMethod.m之上一样。

代替解决方案,我必须在文件夹@cMyClass之外保留/的副本,并手动保持两个副本同步。人为错误会成为一种危险。

请注意,由于我在Microsoft Windows计算机上使用Cygwin,\ln -s都会被用作路径分隔符,具体取决于上下文。

请注意,使用unix的@cMyClass/..创建虚拟副本或在date中创建Microsoft Windows快捷方式不起作用。 Matlab不会将这些视为m文件。

1 个答案:

答案 0 :(得分:1)

这是预期的行为。 MATLAB根据参数的类型调度函数调用。如果cMyClass/func类型为func(obj),则会为obj调用函数cMyClass。如果不是,则会调用另一个func。如果没有为func类定义obj,并且类目录外没有func,则会收到错误。

无法使用@cMyClass/func.m或某种此类语法调用func({})。如果您希望能够使用空对象调用此函数,则需要修改类,以便cMyClass(类构造函数)返回一个空对象。然后你可以func(cMyClass)

另一种方法是让func成为static method。然后你可以称之为wuth cMyClass.func

请注意,对于故障排除和调试,您仍然可以像设置任何其他功能一样设置断点和调试。我真的不认为需要通过非法输入来调用这样的功能......