LlGetListLength/ja
From Second Life Wiki
Second Life Wiki > LlGetListLength/ja
警告
- LSL コンパイラは条件文に関する最適化を行なわず、条件文の外側に関数を引き出したりはしません。 精密に 行う必要がなければ、string 値・key 値・list 値の処理は、自分でループの外側に書いて実行させるべきです。詳しくは 使用上の工夫 を参照してください。
サンプル
//Basic usage default { state_entry() { list l = ["one", "two", "three"]; integer i = llGetListLength(l); llOwnerSay("there are " + (string)i + " entries in the list"); } }
注意点
使用上の工夫
リストのループ処理でリストの長さを使う際は、あらかじめリストの長さを求めておき、それからループ処理に入った方が良いです:
integer i = 0; integer length = llGetListLength(mylist); for (; i < length; ++i) { llSay(0, llList2String(mylist, i)); }
以下は、やらない方が良い例です。 for ループの中で長さを計算しており、非効率になっています。ループを繰り返すたびに長さを再計算して取得しているためです。ループを繰り返すたびに間違いなくリスト (の長さ) が変化する場合にのみ、この方法はとられるべきです。[1]。
integer i; for (i = 0; i < llGetListLength(mylist); ++i) { llSay(0, llList2String(mylist, i)); }
最適化
リストの長さの評価をより速く、より小さい (バイト コードの) サイズで済ます方法は、"!=" で空のリストと比較する事です。これは、リストを "!=" で比較すると、その長さの比較になるためです。
list in; integer len_in = llGetListLength(in); integer flen_in = (in != []); //flen_in と len_in は等しい integer neg_len_in = -llGetListLength(in); integer fneg_len_in = ([] != in); //fneg_len_in と neg_len_in は等しい
関連項目
関数
| • | llListStatistics | – | LIST_STAT_NUM_COUNT – リスト内の integer 型データと float 型データの個数を返します。 | |
| • | llStringLength | – | string 値の文字数を返します。 |
特記事項
議論
JIRA で関連記事を検索ソース
'linden\indra\lscript\lscript_library\lscript_alloc.cpp' @ lsa_cmp_lists
'linden\indra\lscript\lscript_execute\lscript_execute.cpp' @ list_list_operation
脚注
- ^ (長さを計算するときにスタックから取り出すことのできるように) リスト全体がスタックに置かれているときは、VM がリスト全体を (値も含めて) コピーするため、長さの再計算に時間がかかります。
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。

