所以我想优化我的代码,以便我可以浏览一个数组,如
{'one','two','three'}
并创建定义为表或数组的相应变量 比如
one = table()
two = table()
three = table()
我知道eval函数但是我想在循环中使用这个函数s.t我在创建它之后立即将值分配给新变量
答案 0 :(得分:1)
如果我正确理解你的问题,给定一个只由字符串组成的单元格数组,你希望在工作区中创建变量,其中每个变量都使用这个单元格数组中的名称声明为字符串。
您可以使用eval
,但我会推荐eval
以外的其他内容。应避免eval
,而不是重复这些原因,您可以阅读Loren Shure's article on eval
。
无论如何,我建议您将这些变量作为动态字段放在结构中。做这样的事情:
s = struct()
strs = {'one', 'two', 'three'};
for idx = 1 : numel(strs)
s.(strs{idx}) = table();
end
在这种情况下,s
将是一个结构,您可以通过点运算符访问该变量。在这种情况下,您可以通过以下方式访问相应的变量:
d = s.one; %// or
d2 = s.two; %// or
d3 = s.three;
如果你想将它放入一个函数本身,你可以把它放到一个像这样的函数中:
function [s] = createVariables(strs)
s = struct();
for idx = 1 : numel(strs)
s.(strs{idx}) = table();
end
此函数将接收字符串的单元格数组,并输出一个结构,其中包含与您输入的字符串数组相对应的字段。因此,您可以这样调用它:
strs = {'one', 'two', 'three'};
s = createVariables(strs);
但是,如果你真的真的......我的意思是......想要使用eval
,你可以像这样创建你的工作空间变量:
strs = {'one', 'two', 'three'};
for idx = 1 : numel(strs)
eval([strs{idx} ' = table();']);
end
要将其放入函数中,请执行以下操作:
function [] = createVariables(strs)
for idx = 1 : numel(strs)
eval([strs{idx} ' = table();']);
end
但是,请注意,如果运行上述函数,这些变量将仅在运行函数的范围内定义。当函数退出时,不会看到这些变量。如果要运行函数以便在运行函数后在工作空间中定义变量,则eval
不适合您。因此,您应该坚持我在本文开头讨论过的动态字段方法。
在任何情况下,这将创建one
,two
和three
作为初始化为空表的工作空间变量。但是,我将与您争辩说,第一行代码比第二段代码更容易阅读,这是为什么应该避免eval
的主要争论点之一。如果你足够长时间地盯着第二段代码,那么你当然可以看到我们想要实现的目标,但是如果你阅读了第一段代码,就可以更清楚地确定其目的。