9 求值

通常,只需在 Octave 提示符下输入表达式,或要求 Octave 解释保存在文件中的命令,即可对表达式求值。

有时,您可能会发现有必要对已计算并存储在字符串中的表达式进行求值,这正是 eval 函数让您实现的功能。

 
eval (try)
eval (try, catch)
[var1, …] = eval (…)

解析字符串 try 并将其当作 Octave 程序来求值。

如果执行失败,则求值可选字符串 catch

字符串 try 在当前上下文中进行求值,因此任何结果在 eval 返回后仍然可用。

以下示例在当前工作空间中创建变量 A,其近似值为 pi (3.1416)。

eval ('A = acos (-1);');

如果在求值 try 的过程中出现错误,则会求值 catch 字符串,如下例所示:

eval ('error ("This is a bad example");',
      'printf ("This error occurred:\n%s\n", lasterr ());');
     -| This error occurred:
        This is a bad example

相比于在代码字符串 try 中创建变量,将求值结果赋值给输出变量更清晰且略快。第一个例子可以改写为

A = eval ('acos (-1);');

编程注意事项:如果您仅使用 eval 作为一种错误捕获机制,而不是用于执行任意代码字符串,请考虑使用 try/catch 块或 unwind_protect/unwind_protect_cleanup 块。这些技术具有更高的性能,并且不会像求值任意代码那样引入安全考虑。

另请参阅: evalin, evalc, assignin, feval, try, unwind_protect.

evalc 函数还捕获求值表达式所产生的任何控制台输出。

 
s = evalc (try)
s = evalc (try, catch)
[~, var1, …] = evalc (…)

解析并求值字符串 try,就像它是一个 Octave 程序一样,同时将输出捕获到返回变量 s 中。

如果执行失败,则求值可选字符串 catch

此函数的行为类似于 eval,但通常写入控制台的任何输出或警告消息都会被捕获并以字符串形式返回到 s 中。

如果第一个输出 s~ 忽略,则代码求值的实际结果(而非捕获的文本)将赋值给输出变量 var1var2 等。

例1:

s = evalc ("t = 42"), t
  ⇒   s = t =  42

  ⇒   t =  42

例2:

[~, p] = evalc ("pi")
  ⇒   p = 3.1416

编程注意:diary 在执行此函数时被禁用。当使用 system 时,任何外部程序的输出 被捕获,除非它们的输出被 system 函数本身捕获。

另请参阅: eval, diary.


版权所有 © 2024-2026 Octave中文网

ICP备案/许可证号:黑ICP备2024030411号-2