BlackSheep-LSL@Wiki llList2ListStrided

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

llList2ListStrided

list llList2ListStrided(list src, integer start, integer end, integer stride)

リストsrcのstart番目の要素からend番目の要素に関して、stride個ごとに要素を抜き出した別のリストを返す。
ストライダーとは馳夫のことであるが、ここでは意識しなくて良い。
しかしながら、気になる方のために簡単に説明しておくと、
「馳夫」→「大股でスタスタ歩く」→「階段とかも何段か飛ばしで登る」→「リストの要素を何個か飛ばしにする」
こんなイメージ。

一定間隔でリストを抜き出すメリットは、リスト上のデータ管理を以下のように行うことが可能になるからだ。
 [key1, value1, key2, value2, key3, value3....]
時々見かけるかと思うが、キーと値を繰り返して管理するようなリストである。
要素のパターンの繰り返しが、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関数を使うと、上記の処理は一行で可能となる。

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個飛ばしに要素を抜き出す。
名前:
コメント: