Closed. This question is opinion-based 。它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文来回答。

3年前关闭。



Improve this question




我已经展示了 performance of str2func is better ,但我得到了很多评论,指出有更基本的 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 的输出分配给了一个变量,这样可以避免执行很多棘手的代码。
  • 最佳答案

    我将暂时搁置反对这两种方法的论点,尽管它们都是 非常 有效,认真的读者应该尝试理解它们。

    我可以看到两个明显的区别。对于这些示例,我们必须假设您已经使用一些可变数据为脚本中的函数构造了输入字符串,并假设它可以是任何内容(错误或其他方式)。所以我们准备并考虑最坏的情况。

  • str2func 包括一些额外的检查,以确保您传递的是一个有效的函数,这可能会避免不需要的行为。让我们不要采取“是的,但你可以这样做来避免这种情况”的立场,然后看一个例子......
    % Not assigning an output variable
    % STR2FUNC: You've harmlessly assigned ans to some junk function
    str2func('delete test.txt')
    % EVAL: You've just deleted your super important document
    eval('delete test.txt')
    
    % Assigning an output variable
    % STR2FUNC: You get a clear warning that this is not a valid function
    f = str2func('delete test.txt')
    % EVAL: You can a non-descript error "Unexpected MATLAB expression"
    f = eval('delete test.txt')
    
  • 另一个区别是大约一半的 str2func documentation 主题。它涉及变量范围,可在“检查 str2funceval 之间的差异”标题下找到。



  • 所以总而言之,您可能会遇到这样的用例,其中每个函数都更可取,具体取决于您所需的错误处理,并且变量范围不应该尽可能使用 evalstr2func,如其他答案中所述。

    关于matlab - 为什么 `eval` 比 `str2func` 从字符串评估函数更糟糕?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46213509/

    10-10 01:19