我已经定义了一个类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文件。
答案 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
。
请注意,对于故障排除和调试,您仍然可以像设置任何其他功能一样设置断点和调试。我真的不认为需要通过非法输入来调用这样的功能......