llList2ListStrided
list llList2ListStrided(list src, integer start, integer end, integer stride)
リストsrcのstart番目の要素からend番目の要素に関して、stride個ごとに要素を抜き出した別のリストを返す。
ストライダーとは馳夫のことであるが、ここでは意識しなくて良い。
しかしながら、気になる方のために簡単に説明しておくと、
「馳夫」→「大股でスタスタ歩く」→「階段とかも何段か飛ばしで登る」→「リストの要素を何個か飛ばしにする」
こんなイメージ。
ストライダーとは馳夫のことであるが、ここでは意識しなくて良い。
しかしながら、気になる方のために簡単に説明しておくと、
「馳夫」→「大股でスタスタ歩く」→「階段とかも何段か飛ばしで登る」→「リストの要素を何個か飛ばしにする」
こんなイメージ。
一定間隔でリストを抜き出すメリットは、リスト上のデータ管理を以下のように行うことが可能になるからだ。
[key1, value1, key2, value2, key3, value3....]
時々見かけるかと思うが、キーと値を繰り返して管理するようなリストである。
要素のパターンの繰り返しが、3つや4つになることもあるだろう。
要素のパターンの繰り返しが、3つや4つになることもあるだろう。
[item_no1, item_name1, texture1, price1, object_name1, item_no2, item_name2, texture2, price2, object_name2....]
ベンダーなどではありがちな管理方式だ。
こうしたリストから、例えば2番目のtextureのデータだけを抜き出したいような場合、
list items = [ item_no1, item_name1, texture1, price1, object_name1, item_no2, item_name2, texture2, price2, object_name2.... ]; integer i; list texture_list=[]; for (i = 2; i < llGetListLength(items); i+= 5){ texture_list += [llList2String(items.i)]; }
これでももちろん可能であるが、手間だし冗長だ。
llList2ListStrided関数を使うと、上記の処理は一行で可能となる。
llList2ListStrided関数を使うと、上記の処理は一行で可能となる。
list items = [ item_no1, item_name1, texture1, price1, object_name1, item_no2, item_name2, texture2, price2, object_name2.... ]; texture_list = llList2ListStrided(llDeleteSubList(items, 0, 1), 0, -1, 5);
llList2ListStrided関数は常に先頭からの「段飛ばし」になるので、2番目の要素であるtextureを先頭に持ってくるために、llDeleteSubList関数で最初の2要素を削除している。
この点、LSLの実装の仕方がとても頭悪いと思うが、こうなってるから仕方ない。
そして要素は5つ1セットになっているため、llList2ListStrided関数の最後の引数には5を指定し、5個飛ばしに要素を抜き出す。
この点、LSLの実装の仕方がとても頭悪いと思うが、こうなってるから仕方ない。
そして要素は5つ1セットになっているため、llList2ListStrided関数の最後の引数には5を指定し、5個飛ばしに要素を抜き出す。