If/ja
< If
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.
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 は短絡評価を行なわないので、左右いずれもが常に評価されます。短絡評価を行ないたい場合は、以下のようにネストした 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!"); }
このコードは以下の方法で実行できるでしょう。
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..."と発言するでしょう。。。