If/ja

From Second Life Wiki
< If
Revision as of 06:48, 30 December 2007 by Asuka Neely (talk | contribs) (New page: {{Multi-lang}} {{#vardefine:p__desc| }}{{#vardefine:p_condition_desc|もし実行して真なら'''branch'''が実行されます。 }}{{#vardefine:p_condition_d_desc| もし実行して...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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の演算は短絡しません。たとえば:

// A simple method to say if the method was called.
integer test() {
    llOwnerSay("Test method called!");
    
    return TRUE;
}

default {
    touch_start(integer total_number) {
        if (FALSE && test()) { // If short-circuit optimized then the test() should never be called.
            // Will never get here.
        }
    }
}

短絡な言語では、AND(&&)の左側がFALSEなら、右側はどんな値であろうとテストされることなくFALSEを返すでしょう。 LSLは短絡的ではないので、常に左と右の両方がテストされます。もしネストされた構造を使用した場合のシミュレートはこうなるでしょう。

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..."と発言するでしょう。。。