4.3 – 有效索引与可接受索引
API 中的函数若需要传入栈索引,这个索引必须是有效索引 或是 可接受索引。
有效索引 指引用栈内真实位置的索引;即在 1 到栈顶之间的位置(1 ≤ abs(index) ≤ top
)。通常,一个可能修改该位置的值的函数需要传入有效索引。
除非另有说明,任何可以接受有效索引的函数同时也接受 伪索引。伪索引指代一些可以被 C code 访问得到 Lua 值,而它们又不在栈内。这用于访问注册表以及 C 函数的上值(参见 §4.4)。
对于那些只是需要栈中的值(例如查询函数)而不需要指定一个栈位置的函数,可以用一个可接受的索引去调用它们。可接受索引 不仅可以是任何包括伪索引在内的有效索引,还可以是任何超过栈顶但落在为栈分配出来的空间内的正索引。(注意 0 永远都不是一个可接受索引。)除非另有说明,API 里的函数都接受可接受索引。
允许可接受索引是为了避免对栈顶以外的查询时做额外的检查。例如,C 函数可以直接查询传给它的第三个参数,而不用先检查是不是有第三个参数,即不需要检查 3 是不是一个有效索引。
对于那可以接受索引调用的函数,无效索引被看作包含了一个虚拟类型LUA_TNONE
的值,这个值的行为和 nil 一致。