在matlab中的其他人的代码中遇到了函数 eval(expression)的使用: 例如:
for n = 1 : 4
sn = int2str( n) ;
eval( [ 'saveas( fig' sn ', [ sName' sn ' ], ''fig'' ) ' ] );
end
Matlab帮助中的MathWorks东西指出:
eval函数的许多常见用法效率较低,并且比其他MATLAB函数和语言结构更难以阅读和调试。
在此之后,我发现在许多其他程序语言中使用此函数,如Python,JavaScript,PHP。
所以我有几个问题:
答案 0 :(得分:6)
eval
功能危险,您实际需要它的示例很少。例如,如果将图形句柄存储在数组fig(1)
,fig(2)
等中并写入
for n = 1:4
filename = sprintf('sName%d', n);
saveas(fig(n), filename, 'fig');
end
更清晰,使用更少的字符,可以通过Matlab编辑器的linter进行分析,如果(当)需要扩展代码时更容易修改,并且不易出现奇怪的错误。
根据经验,除非你真的知道自己在做什么(即你正在编写一个复杂的Lisp宏或其他等同于操纵语言的AST的东西),否则不要在任何语言中使用eval
。如果您不知道这意味着什么,您可能不需要使用eval
)。
几乎总能有更清晰,更有效,更危险的方法来达到同样的效果。通常,对eval
的调用可以替换为某种形式的recursion,higher-order function或循环。
答案 1 :(得分:5)
eval
行。fig1
到fig4
的变量名称中。如果它们存储在名为fig
的数组中,即fig(1)
等,那么eval
就不必要了。 编辑以下是Loren Shure关于为什么在Matlab中应该避免eval
的两篇优秀文章。 Evading eval和More on eval。
答案 2 :(得分:1)
在大多数情况下,发生减速是因为必须将字符串解析为实际代码。如果谨慎使用,这不是一个主要的问题,但是如果你发现自己在循环的代码中使用它(要么是显式循环,要么是JavaScript的setInterval()
之类的东西),那么你就会遇到重大的性能下降。
我见过eval
可以做得更好的常见用途是:
[]
表示法switch
(更安全,可防止代码注入风险)var1
,var2
,var3
的变量说实话,我认为我从未遇到eval
是解决问题的唯一方法。我想你可以将它比作goto
,因为它可以替代程序结构,或者在花费时间使其最佳运行之前作为测试程序的临时解决方案。
答案 3 :(得分:1)
这是另一个含义:
编译使用eval
的程序时,必须放置编译指示,告诉编译器需要某些函数。例如:
此代码将编译并运行良好:
foo()
但是这个需要添加一个pragma:
%#function foo
eval('foo()')
否则您将遇到运行时问题。