4

The Implementation of Lua 5.0のセクション 4 の Tables には、次の例があります。
local t = {100, 200, 300, x = 9.3}

だから私たちは持っていt[4] == nilます。と書くとハッシュ部分t[0] = 0に行きます。 書いたらどこに行くの?配列部分またはハッシュ部分? 違いがある場合は、Lua 5.1、Lua 5.2、LuaJIT 2 の実装について回答をお待ちしています。
t[5] = 500

4

2 に答える 2

1

Lua 5.0の実装より引用

配列部分は、1 からある制限 n までの整数キーに対応する値を格納しようとします。非整数キーまたは配列範囲外の整数キーに対応する値は、ハッシュ部分に格納されます。

配列部分のインデックスは 1 から始まるt[0] = 0ため、ハッシュ部分に移動します。

配列部分の計算されたサイズは、1 と n の間のスロットの少なくとも半分が使用され (まばらな配列でスペースを浪費するのを避けるため)、n/2+1 と n( n/2 の場合にサイズ n を避けるため)。

この規則によると、例の表では次のようになります。

local t = {100, 200, 300, x = 9.3}

3 つの要素を保持する配列部分のサイズは、3、4、または 5 です。(編集: サイズは 4 にする必要があります。@dualed のコメントを参照してください。)

配列のサイズが 4 だとすると、 を書き込むt[5] = 500と、配列部分が要素を保持できなくなりt[5]、配列部分のサイズが 8 に変更された場合はどうなるでしょうか。サイズが 8 の場合、配列部分は 4 つの要素を保持します。これは、配列サイズの半分に等しい (つまり、それ以下ではない) ことになります。また、n/2+1 と n の間のインデックス (この場合は 5 から 8) には 1 つの要素がありますt[5]。したがって、配列サイズ 8 で要件を満たすことができます。この場合、t[5]配列部分に移動します。

于 2013-07-10T13:05:02.600 に答える