スタックは、インデックス 1 を持つ下部 (つまり、最初にプッシュされた) 要素を使用して、下部から成長し、次に別の要素 (インデックス 2)、次に別の要素 (インデックス 3) などをプッシュすると想像できます。この状況:
+-----------------------+
| element with index 6 | <-- top ("relative" index -1)
+-----------------------+
| element with index 5 | <-- -2
+-----------------------+
| element with index 4 | <-- -3
+-----------------------+
| element with index 3 | <-- -4
+-----------------------+
| element with index 2 | <-- -5
+-----------------------+
| element with index 1 | <-- bottom ("relative" index -6 )
+-----------------------+
また、「通常のインデックス」(下からインデックス付けされたインデックス) は、要素の絶対インデックス (1 から始まる以外に、C の配列のインデックスと同様) であるとも言えます。代わりに、負のインデックスはスタックのトップに対して「相対的」です。lua_gettop
スタックトップの絶対インデックスを提供します(常に相対インデックスがあります-1
)。
では、スタックにインデックスを付ける方法が 2 つあるのはなぜでしょうか。配列のような要素にアクセスすると便利な場合もあれば (絶対インデックスを使用)、最後にプッシュされた要素にのみアクセスする必要がある場合もあります (つまり、上からインデックスを付ける)。
ところで、私は通常、Lua スタックを逆に視覚化します。つまり、上から始まり、下に向かって成長します (つまり、スタックの上部は私の精神的表現の下部にあります)。このメンタル モデルは、インデックス -1 を「最初のプッシュが見つかるまでコードを (したがって上向きに) 戻る」と解釈するため、より有用であることがわかります。このように、インデックス -2 は「2 番目のプッシュが見つかるまでコードを戻す」などになります。これにより、どこに何をプッシュしたかをすばやく特定できます。
ただし、混乱を避けるために、ここではより古典的な表現を使用しました。つまり、実際にはスタック トップが一番上に描かれています。