Category:LSL 負のインデックス

From Second Life Wiki
Jump to: navigation, search

負のインデックスは、インデックスを末尾から数えたものとして扱われます。

例えば string s = "Hello World" の場合

  • インデックス 0 は 'H' です。(llGetSubString(s,0,0))
  • インデックス -1 は 'd' です。(llGetSubString(s,-1,-1))
  • インデックス -5 は 'W' です。(llGetSubString(s,-5,-5))


負のインデックスは非常に単純で、LSL はそれを正のインデックスと対であるかのように扱います。
例えば n_ind が文字列 str の負のインデックスだとすると、n_ind の正のインデックス形式は n_ind + llStringLength(str); となります。
例えば p_ind が文字列 str の正のインデックスだとすると、p_ind の負のインデックス形式は p_ind - llStringLength(str); となります。


このカテゴリで扱う関数との組み合わせで、llListFindListllSubStringIndex の戻り値を扱う時は注意が必要です。これらの関数は '見つからなかった' を表現するために -1 というインデックスを戻り値とします。範囲を指定する関数にこれをインデックス値として渡すことは可能ですが、望む結果は得られないでしょう。

<lsl> string s = "Hello World";

integer index = llSubStringIndex(s, "t");//index == -1 if(~index) //(index != -1) と同じだが、若干早い。

          //-1 (ビットが全て立っている) を '~' でビット反転すると
          //0 (False) になる。

{

   s = llDeleteSubString(s, index, index);

} </lsl>

範囲を指定する関数

List

String

ややこしい事に、範囲を指定する関数は2つのインデックスと、その範囲で処理される処理対象を持ちます。これらの関数は開始と終了のインデックスを引数に持ちます。負のインデックスは、それと等価な正のインデックスであるかのように扱われます。

  • 開始インデックス (start) が終了インデックス (end) 以下の場合、関数は [start, end] を範囲とみなします。
  • 開始インデックスが終了インデックスより大きい場合は、[0, end] + [start, ] を範囲とみなします。

可変長の文字列やリストで非連続なインデックスを扱うのはトリッキーな事です。その長さに応じて、処理対象の範囲は増減します。この点を、先頭および末尾から範囲をとる非連続なインデックスを扱う際には留意してください。

<lsl>string bad(string in) {

   return llGetSubString(in, 5, -5);

}

bad("Hello World!");//戻り値は " Wo"、範囲が [5, 8] となるため。 bad("Hello Cat!");//戻り値は " "、範囲が [5, 5] となるため。 bad("Hello !");//戻り値は "Hel !"、範囲が [0, 2] + [5 , 6] となるため。</lsl>

This category currently contains no pages or media.