我想迭代Matlab类。这可能吗?
我的应用程序有几个基于不同结构和算法的子类,但每个子类实现相同的(类和实例)方法。所以我很自然地拥有将子类作为参数的测试用例。例如,在Ruby中,这很容易
[ClassA, ClassB].each do |cls|
if cls.some_class_method? then
instance = cls.new
:
end
end
但是我似乎无法在Matlab中找到一种方法来做到这一点,似乎并没有"类处理"。
有办法吗?
[编辑]
按照@ zeeMonkeez的解决方案,我最终得到了以下内容
function varargout = call_method(class_name, method_name, varargin)
qualified_name = sprintf('%s.%s', class_name, method_name);
[varargout{1:nargout}] = feval(qualified_name, varargin{:});
end
我可以在我的测试用例中调用
class_name = 'MVPolyCube';
:
[x, y, z] = call_method(class_name, 'variables');
解决了我的问题并干掉了我的测试套件。谢谢大家!
答案 0 :(得分:1)
如果您不介意使用feval
,可以执行以下代码。
基本上,我们测试是否存在类名的给定名称的静态方法(使用meta.class
)。然后我们使用feval
获得所述方法的返回值。基于此,我们实例化一个对象(再次使用feval
)。
A.m
:
classdef A
methods
function whoami(this)
fprintf('I am an A\n');
end
end
methods(Static)
function out = a
out = true;
fprintf('A.a returns %i\n', out);
end
end
end
B.m
:
classdef B
methods
function whoami(this)
fprintf('I am a B\n');
end
end
methods(Static)
function out = a
out = false;
fprintf('B.a returns %i\n', out);
end
function out = b
out = true;
fprintf('B.b returns %i\n', out);
end
end
end
has_static_method.m
将用于测试类是否具有静态函数:
function res = has_static_method(class_name, method_name)
mc = meta.class.fromName(class_name);
ml = mc.MethodList;
ml = ml([mc.MethodList.Static]);
res = any(strcmp(method_name, {ml.Name}));
end
test.m
:
classes = {'A', 'B'};
for i_c = 1:numel(classes)
klass_name = classes{i_c};
static_function_name = 'a';
if has_static_method(klass_name, static_function_name) && feval(sprintf('%s.%s', klass_name, static_function_name))
an_object = feval(klass_name);
an_object.whoami
end
static_function_name = 'b';
if has_static_method(klass_name, static_function_name) && feval(sprintf('%s.%s', klass_name, static_function_name))
an_object = feval(klass_name);
an_object.whoami
end
end