If/ja
< If
| LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
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は短絡的ではないので、常に左と右の両方がテストされます。もしネストされた構造を使用した場合のシミュレートはこうなるでしょう。
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!");
}
このコードは以下の方法で実行できるでしょう。
if (a == "Loren");行は、セミコロンが、これが一行のifステートメントだとLSLに教えることで実行するでしょう。- そして、コードブロックの開始部と実行させるコンテンツが同じなら、たとえ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..."と発言するでしょう。。。