我在matlab中的其他人的代码中遇到了函数eval(表达式)的使用:例如:
for n = 1 : 4
sn = int2str( n) ;
eval( [ 'saveas( fig' sn ', [ sName' sn ' ], ''fig'' ) ' ] );
end
Run Code Online (Sandbox Code Playgroud)
Matlab帮助中MathWorks的东西指出:
eval函数的许多常见用法效率较低,并且比其他MATLAB函数和语言结构更难以阅读和调试.
在此之后,我发现在许多其他程序语言中使用此函数,如Python,JavaScript,PHP.
所以我有几个问题:
该eval功能很危险,实际需要它的例子非常少.例如,如果将图形句柄存储在数组等中并写入fig(1),则可以轻松地重写您提供的代码fig(2)
for n = 1:4
filename = sprintf('sName%d', n);
saveas(fig(n), filename, 'fig');
end
Run Code Online (Sandbox Code Playgroud)
更清晰,使用更少的字符,可以通过Matlab编辑器的linter进行分析,如果(何时)需要扩展代码,则更容易修改,并且不易出现奇怪的错误.
根据经验,你不应该使用eval任何语言,除非你真的知道你在做什么(即你正在编写一个复杂的Lisp宏或其他等同于操纵语言的AST的东西 - 如果你不知道那是什么意思是,你可能不需要使用eval).
几乎总是有更清晰,更有效和更危险的方法来实现相同的结果.通常,调用eval可以用某种形式的递归,高阶函数或循环替换.
eval无法优化行.fig1through的变量名称中fig4.如果它们已存储在一个名为etc 的数组中fig,那就没必要了.fig(1)eval编辑以下是Loren Shure关于为什么eval要在Matlab中避免的两篇优秀文章.避开eval,以及更多有关eval的信息.