If/ja

From Second Life Wiki
< If
Revision as of 06:07, 12 April 2009 by MasterOf Perl (talk | contribs) (Update translation)
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

if ( condition ) branch

•  condition もし実行して真ならbranchが実行されます。
•  branch シングルステートメント、ブロックステートメント、空のステートメントの何れかが可能です。

if ( condition ) branch_true else branch_false

•  condition もし実行して真ならbranch_trueが実行され、それ以外の場合branch_falseが実行されます。
•  branch_true シングルステートメント、ブロックステートメント、空のステートメントの何れかが可能です。
•  branch_false シングルステートメント、ブロックステートメント、空のステートメントの何れかが可能です。

詳細

条件の種類
条件
integer 0ではない場合は真。
float 0ではない場合は真。
string 文字列の長さが0ではない場合は真。
key keyが有効でNULL_KEYではない場合のみ真。
vector vectorがZERO_VECTORではない場合は真。
rotation rotationがZERO_ROTATIONではない場合は真。
list listの長さが0ではない場合は真。正しい動作は、Monoでコンパイルされたスクリプトのみで見られ、LSOでコンパイルされたスクリプトは誤って false になります。BUG-230728

LSLの演算は短絡しません。たとえば:

// 簡単な手順でのifを呼び出す方法
integer test() {
    llOwnerSay("Test method called!");
    
    return TRUE;
}

default {
    touch_start(integer total_number) {
        if (FALSE && test()) { // もし短絡的な最適がされていた場合、test()が呼ばれることは無いでしょう。
            // Will never get here.
        }
    }
}

短絡評価を行なう言語では、論理演算 AND (&&) の左側が FALSE だった場合、右側は決して評価されません。なぜなら右側の値が何であろうと、全体の評価は常に FALSE となるからです。LSL は短絡評価を行なわないので、左右いずれもが常に評価されます。短絡評価を行ないたい場合は、以下のようにネストした if 文で代替できます:

default {
    touch_start(integer total_number) {
        if (FALSE) {
            if (test()) {
              // 実行されることがない
            }
        }
    }
}

簡単なインラインのifステートメント:

if (a == 1) c = b;

簡単なブロックifステートメント:

if (a == 1)
{
    // 何らかの処理
}

連なったif/elseブロック (この例では一つの行のみ発言するでしょう)

if (a == "Loren") {
    llSay(0, "Lorem ipsum sic amet!");
} else if (a == "Bob") {
    llSay(0, "Babble dabble rabble rouse.");
} else {
    llSay(0, "Gobbledygook?  or English?");
}

複合的なifステートメント:

if (a == 1 && b == c)
{
    // ここで何らかの処理
}

ネストされたifステートメント:

if (a == 1)
{
    if (b == c)
    {
        // ここで何らかの処理
    }
}

セミコロンの置き間違いに気をつけましょう。奇妙なことを起こしてしまうでしょう。 もしifステートメントとコードブロックの間にセミコロンを置いた場合、ifステートメントはブロックの実行操作ができないでしょう。実例:

if (a == "Loren");
{
    llSay(0, "Lorem ipsum sic amet!");
}

このコードは以下の方法で実行できるでしょう。

  1. if (a == "Loren");行は、セミコロンが、これが一行のifステートメントだとLSLに教えることで実行するでしょう。
  2. そして、コードブロックの開始部と実行させるコンテンツが同じなら、たとえifステートメントよりも前に何が来ようとも、このケースでは"Lorem ipsum sic amet!"と発言します。

中括弧を忘れた場合は別の問題が発生します。

if (a == "Loren")
    llSay(0, "Lorem ipsum sic amet!");
    llSay(0, "I don't know what it means either...");

この条件では字下げによって、ifステートメントにより両方のllSayコマンドが操作されるかのように見えます。実際には、もし a が"Joe"と同義なら、常に"I don't know what it means either..."と発言するでしょう。。。