我需要一些帮助才能使用varargin在句柄类中分配属性。
如果我使用varargin创建一个函数,而不是使用handle类,它可以工作。
function out = testFunction(varargin)
% default values
startDate = '2011-11-01';
endDate = datestr(now,'yyyy-mm-dd');
% Map of parameter names to variable names
params_to_variables = containers.Map({'StartDate','EndDate'}, {'startDate','endDate'});
v = 1;
while v <= numel(varargin)
param_name = varargin{v};
if isKey(params_to_variables,param_name)
assert(v+1<=numel(varargin));
v = v+1;
% Trick: use feval on anonymous function to use assignin to this workspace
feval(@()assignin('caller',params_to_variables(param_name),varargin{v}));
else
error('Unsupported parameter: %s',varargin{v});
end
v=v+1;
end
end
但我目前的任务是创建一个包含许多属性的超类。有各种类型的子类。不同的子类可能需要使用不同的属性。所以当我创建一个超类或子类的实例时,我需要输入非常灵活。如上例所示,一个子类只需要属性'startDate',而另一个子类只需要属性'endDate'。这是我的代码。
classdef superclass < handle
properties
startDate
endDate
end
methods
function obj = superclass(varargin)
% Map of parameter names to variable names
params_to_variables = containers.Map({'StartDate','EndDate'}, {'startDate','endDate'});
v = 1;
while v <= numel(varargin)
param_name = varargin{v};
if isKey(params_to_variables,param_name)
assert(v+1<=numel(varargin));
v = v+1;
feval(@()assignin('caller',params_to_variables(param_name),varargin{v}));
else
error('Unsupported parameter: %s',varargin{v});
end
v=v+1;
end
end
end
end
基本上我只是复制粘贴,它不起作用。 所以我改变了
feval(@()assignin('caller',params_to_variables(param_name),varargin{v}));
到
feval(@()assignin('caller',strcat('obj.',params_to_variables(param_name),varargin{v}));
或
feval(@()assignin('base',strcat('obj.',params_to_variables(param_name),varargin{v}));
或
evalin('caller',...
strcat('obj.',params_to_variables(param_name),'=',num2str(varargin{v})));
或
evalin('base',...
strcat('obj.',params_to_variables(param_name),'=',num2str(varargin{v})));
它们都不起作用。如果有人能告诉我如何解决这个问题或者为我提供另一种方式,我很感激。谢谢。