Difference between revisions of "LlGetListLength/ja"

From Second Life Wiki
Jump to: navigation, search
Line 10: Line 10:
 
|constants
 
|constants
 
|examples=
 
|examples=
<lsl>//Basic usage
+
<source lang="lsl2">//Basic usage
 
default
 
default
 
{
 
{
Line 19: Line 19:
 
         llOwnerSay("there are " + (string)i + " entries in the list");
 
         llOwnerSay("there are " + (string)i + " entries in the list");
 
     }
 
     }
}</lsl>
+
}</source>
  
 
|notes=
 
|notes=
Line 25: Line 25:
 
リストのループ処理でリストの長さを使う際は、あらかじめリストの長さを求めておき、それからループ処理に入った方が良いです:
 
リストのループ処理でリストの長さを使う際は、あらかじめリストの長さを求めておき、それからループ処理に入った方が良いです:
  
<lsl>
+
<source lang="lsl2">
 
integer i = 0;
 
integer i = 0;
 
integer length = llGetListLength(mylist);
 
integer length = llGetListLength(mylist);
Line 31: Line 31:
 
     llSay(0, llList2String(mylist, i));
 
     llSay(0, llList2String(mylist, i));
 
}
 
}
</lsl>
+
</source>
  
 
以下は、やらない方が良い例です。 for ループの中で長さを計算しており、非効率になっています。ループを繰り返すたびに長さを再計算して取得しているためです。ループを繰り返すたびに間違いなくリスト (の長さ) が変化する場合にのみ、この方法はとられるべきです。{{Footnote|(長さを計算するときにスタックから取り出すことのできるように) リスト全体がスタックに置かれているときは、VM がリスト全体を (値も含めて) コピーするため、長さの再計算に時間がかかります。}}。
 
以下は、やらない方が良い例です。 for ループの中で長さを計算しており、非効率になっています。ループを繰り返すたびに長さを再計算して取得しているためです。ループを繰り返すたびに間違いなくリスト (の長さ) が変化する場合にのみ、この方法はとられるべきです。{{Footnote|(長さを計算するときにスタックから取り出すことのできるように) リスト全体がスタックに置かれているときは、VM がリスト全体を (値も含めて) コピーするため、長さの再計算に時間がかかります。}}。
  
<lsl>
+
<source lang="lsl2">
 
integer i;
 
integer i;
 
for (i = 0; i < llGetListLength(mylist); ++i) {
 
for (i = 0; i < llGetListLength(mylist); ++i) {
 
     llSay(0, llList2String(mylist, i));
 
     llSay(0, llList2String(mylist, i));
 
}
 
}
</lsl>
+
</source>
  
 
===最適化{{Anchor|Optimizations}}===
 
===最適化{{Anchor|Optimizations}}===
 
リストの長さの評価をより速く、より小さい (バイト コードの) サイズで済ます方法は、"!=" で空のリストと比較する事です。これは、リストを "!=" で比較すると、その長さの比較になるためです。
 
リストの長さの評価をより速く、より小さい (バイト コードの) サイズで済ます方法は、"!=" で空のリストと比較する事です。これは、リストを "!=" で比較すると、その長さの比較になるためです。
<lsl>
+
<source lang="lsl2">
 
list in;
 
list in;
 
integer len_in = llGetListLength(in);
 
integer len_in = llGetListLength(in);
Line 53: Line 53:
 
integer fneg_len_in = ([] != in);
 
integer fneg_len_in = ([] != in);
 
//fneg_len_in と neg_len_in は等しい
 
//fneg_len_in と neg_len_in は等しい
</lsl>
+
</source>
 
|helpers
 
|helpers
 
|also_functions=
 
|also_functions=

Revision as of 07:06, 25 February 2016

要約

関数: integer llGetListLength( list src );

リスト src にある要素数を integer で返します。

• list src

警告

  • LSL コンパイラは条件文に関する最適化を行なわず、条件文の外側に関数を引き出したりはしません。 精密に 行う必要がなければ、string 値・key 値・list 値の処理は、自分でループの外側に書いて実行させるべきです。詳しくは 使用上の工夫 を参照してください。
All Issues ~ Search JIRA for related Bugs

サンプル

//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 値の文字数を返します。

特記事項

Search JIRA for related Issues

ソース

'linden\indra\lscript\lscript_library\lscript_alloc.cpp' @ lsa_cmp_lists
'linden\indra\lscript\lscript_execute\lscript_execute.cpp' @ list_list_operation

脚注

  1. ^ (長さを計算するときにスタックから取り出すことのできるように) リスト全体がスタックに置かれているときは、VM がリスト全体を (値も含めて) コピーするため、長さの再計算に時間がかかります。

Signature

function integer llGetListLength( list src );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。