eval、后引号和 () 之间有何差异?

 
 
 

命令和过程是以相同的方式执行的。下列示例说明了这一点。

proc float myTime(string $dummyFlag, float $time) {return $time;}
 currentTime -e 1;
 myTime -e 1;
 currentTime "-e" "1";
 myTime "-e" "1";
 currentTime("-e", 1);
 myTime("-e", 1);

若要执行命令或过程并获得返回值,可以按下列示例所说明的那样,使用 eval、``或 () 语法。

string $transforms[];
$transforms = eval("ls -type transform");
$transforms = `ls -type transform`;
$transforms = ls("-type", "transform");

使用其中每种类型的语法时需要记住的重要事项如下:以下是它们之间的关键差异。阅读这些内容,以便了解要使用其中哪种。

eval

  1. 允许延迟的求值。通常,执行脚本时,如果未定义命令,Maya 仍会尝试执行脚本。

    例如,如果尝试执行一个脚本,该脚本首先加载插件,然后立即执行该插件,那么执行插件命令时,该脚本将失败。这是由于 Maya 最初会对脚本求值以检查它所不知道的命令。但是,如果插件命令是使用 eval 语法执行的,那么脚本将不会失败。

  2. 可以嵌套命令。例如:eval ("sphere; cone; ls") ;
  3. 整个命令(包括其参数)必须为单个字符串。例如:eval ("ls -type transform") ;

后引号

  1. 立即求值。
  2. 无法嵌套命令。
  3. 不需要将字符串参数括在引号中。例如:string $trans2[] = `ls -type transform`;
  4. 不能作为独立的命令使用该语法,因为它是用于指定一个命令的结果或构建另一个命令。例如,不能执行下列命令:`ls -type transform`;

( )

  1. 立即求值。
  2. 无法嵌套命令。
  3. 必须将字符串参数括在引号中。例如,如果 $faces 表示对象中的面数,那么可能会使用 ( ) 来构建要打印输出的字符串。

print("This object has " + $faces + " faces \n");