【发布时间】:2018-02-23 02:35:04
【问题描述】:
我已经展示了performance of str2func is better,但是我得到了很多 cmets 说有更基本的reasons 不使用eval。在以下情况下,哪些根本原因适用于eval 而不适用于str2func:
f='a^x+exp(b)+sin(c*x)+d'
-
eval:y = eval(f)或(由rahnema1建议)
fHandle = eval(['@(x, a, b, c, d) ' f]); y = fHandle(x, a, b, c, d); -
str2func:fHandle = str2func(['@(x, a, b, c, d) ' f]); y = fHandle(x, a, b, c, d);
除了performance reasons,为什么第一个选项比第二个差?
备注
请注意,我知道最好避免这两种方法。
请注意,我将
eval的输出分配给了一个变量,这样可以避免执行很多棘手的代码。
【问题讨论】:
-
你可能想比较
fHandle = str2func(['@(x, a, b, c, d) ' f]);和fHandle = eval(['@(x, a, b, c, d) ' f]); -
如果您没有将有效的函数字符串传递给
str2func,它将发出警告(或在未来的 [current?] 版本中出现错误)。但是,如果您没有将有效函数传递给eval,它无论如何都会按照您的要求进行操作......想象一下eval('delete C:/*')是如何获得可怕结果的示例。显然你不会故意犯这个错误,但这是夸大了在构建函数字符串时可能会出错的点(因此为什么你应该尽可能避免这两种情况)和更多的验证检查更好。 -
@Wolfie
y = eval('delete my_file.m')返回错误(并且不删除文件):Error: Unexpected MATLAB expression.。 (使用 R2016b 测试) -
eval('!del my_file.m')将在 windows 上删除my_file.m -
tldr;由于您试图忽略的原因,应尽可能避免这两种功能,因此这是一个有争议的问题。如果您必须使用
str2func,请在eval上使用它,因为它略微内置了更多保护功能。