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. 引数も含めたコマンド全体を 1 つの文字列にする必要があります。例: eval ("ls -type transform");

` ` (バッククォート)

  1. 評価がすぐに行われます。
  2. コマンドを埋め込むことはできません。
  3. 文字列引数を引用符で囲む必要がなくなります。例: string $trans2[] = `ls -type transform`;
  4. この構文はあるコマンドの結果の代入や、別のコマンドの構築を目的にしているため、スタンドアローン コマンドとして使用することはできません。たとえば、`ls -type transform`; のようなことはできません。

( )

  1. 評価がすぐに行われます。
  2. コマンドを埋め込むことはできません。
  3. 文字列引数を引用符で囲む必要があります。たとえば、$faces がオブジェクトのフェース数を表している場合、( )を使用して、出力する文字列を構築することができます。

print ("このオブジェクトには" + $faces + " 個のフェースがあります ¥n");