以字符串形式获取给定名称的对象句柄 (MATLAB)
Get object handle given the name as a string (MATLAB)
给出一个变量的名称作为字符串(在我的例子中,用户选择的工作区中现有 Simulink.Parameter 变量的名称作为优化的设计变量),我想成为能够在不使用 eval() 的情况下访问对象的属性,例如 Simulink.Parameter.Min、Simulink.Parameter.Max、Simulink.Parameter.Value 。到目前为止,我正在使用(非常丑陋的)解决方案
varnames = {'var1','var2'}; % Simulink.Parameter objects existing in workspace
objects = cell(length(varnames),1);
for i = 1:length(varnames)
eval(['objects{i}=', varnames{i}, ';']) % Store objects in a cell array
end
理想情况下,这看起来像:
objects = get_object_handles_from_string(varnames);
value_1 = object{1}.Value(:);
否则返回给定对象句柄的变量名的方法也是可以接受的。
我发现行不通但可能有用的方法:
- whos 在当前工作区中找到变量名称和属性,但没有句柄。
- inputname returns the variable name of an explicit function input as a string but does not work for cell arrays of objects (see this question).
- str2func returns 以字符串作为输入但不允许访问属性的函数句柄。
- findobj returns 对象给定了一个对象数组来迭代我没有的对象。可能有一种方法将所有工作区变量句柄作为数组返回吗?
谢谢!
这正是 eval
的用途。是的,你应该避免使用 eval
,但如果你想让用户输入要评估的东西,你需要 eval
。 Or evalin
if you want to evaluate it in the base or caller workspace 而不是当前工作区。
没有"object handles"这样的东西(图形对象除外,但这不是你在这里谈论的)。有变量拥有数据数组,就是这样。
如果您不信任您的用户,请不要使用 eval
。他们可以输入任何内容,包括 clear all
或 !\rm -rf /*
(或 Windows 等同于擦除磁盘的任何内容)。
在这种情况下,假设用户可以指定一组有限的变量,
var1 = 1;
var2 = 2;
varnames = {'var1','var2'}; % Simulink.Parameter objects existing in workspace
objects = cell(size(varnames));
for i = 1:numel(varnames)
objects{i} = get_variable_value(varnames{i}) % Store objects in a cell array
end
function val = get_variable_value(name)
switch name
case 'var1'
val = evalin('caller',var1);
case 'var2'
val = evalin('caller',var2);
otherwise
error('Illegal variable name')
end
给出一个变量的名称作为字符串(在我的例子中,用户选择的工作区中现有 Simulink.Parameter 变量的名称作为优化的设计变量),我想成为能够在不使用 eval() 的情况下访问对象的属性,例如 Simulink.Parameter.Min、Simulink.Parameter.Max、Simulink.Parameter.Value 。到目前为止,我正在使用(非常丑陋的)解决方案
varnames = {'var1','var2'}; % Simulink.Parameter objects existing in workspace
objects = cell(length(varnames),1);
for i = 1:length(varnames)
eval(['objects{i}=', varnames{i}, ';']) % Store objects in a cell array
end
理想情况下,这看起来像:
objects = get_object_handles_from_string(varnames);
value_1 = object{1}.Value(:);
否则返回给定对象句柄的变量名的方法也是可以接受的。
我发现行不通但可能有用的方法:
- whos 在当前工作区中找到变量名称和属性,但没有句柄。
- inputname returns the variable name of an explicit function input as a string but does not work for cell arrays of objects (see this question).
- str2func returns 以字符串作为输入但不允许访问属性的函数句柄。
- findobj returns 对象给定了一个对象数组来迭代我没有的对象。可能有一种方法将所有工作区变量句柄作为数组返回吗?
谢谢!
这正是 eval
的用途。是的,你应该避免使用 eval
,但如果你想让用户输入要评估的东西,你需要 eval
。 Or evalin
if you want to evaluate it in the base or caller workspace 而不是当前工作区。
没有"object handles"这样的东西(图形对象除外,但这不是你在这里谈论的)。有变量拥有数据数组,就是这样。
如果您不信任您的用户,请不要使用 eval
。他们可以输入任何内容,包括 clear all
或 !\rm -rf /*
(或 Windows 等同于擦除磁盘的任何内容)。
在这种情况下,假设用户可以指定一组有限的变量,
var1 = 1;
var2 = 2;
varnames = {'var1','var2'}; % Simulink.Parameter objects existing in workspace
objects = cell(size(varnames));
for i = 1:numel(varnames)
objects{i} = get_variable_value(varnames{i}) % Store objects in a cell array
end
function val = get_variable_value(name)
switch name
case 'var1'
val = evalin('caller',var1);
case 'var2'
val = evalin('caller',var2);
otherwise
error('Illegal variable name')
end