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
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
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]
配列部分に移動します。