gpt4 book ai didi

lua - Lua 的长度运算符可能会返回负索引吗?

转载 作者:行者123 更新时间:2023-12-04 18:27:10 24 4
gpt4 key购买 nike

嗯,special specification of Lua's length operator让我想知道 Lua 是否会被“允许”在类似情况下返回负值

#{[-5]=1,[-1]=3}

它说:

The length of a table t is defined to be any integer index n such that t[n] is not nil and t[n+1] is nil;

n=-5n=-1 在我的例子中会满足这个标准,对吗?

moreover, if t[1] is nil, n can be zero.

对,它可以为零,但不能保证,对吧?

For a regular array, with non-nil values from 1 to a given n, its length is exactly that n, the index of its last value.

这里不是这种情况,因此不适用。

If the array has "holes" (that is, nil values between other non-nil values), then #t can be any of the indices that directly precedes a nil value (that is, it may consider any such nil value as the end of the array).

这里就是这种情况,所以 n=-5n=-1 将是有效的返回值,对吗?

我能否完全确定 Lua 总是为示例表或任何其他仅包含负索引的表返回 0?如果(假设地)我正在编写一个 Lua 解释器并返回这些值中的任何一个,我是否符合规范?

编辑

很明显,Lua 的实现方式,它不返回负值。我觉得长度运算符的文档有些不足,而且我看到 Lua 5.2 的文档已经更改。它现在说:

Unless a __len metamethod is given, the length of a table t is only defined if the table is a sequence, that is, the set of its positive numeric keys is equal to {1..n} for some integer n. In that case, n is its length. Note that a table like

  {10, 20, nil, 40}

is not a sequence, because it has the key 4 but does not have the key 3.

因此,它现在谈论正数 数字键,这更清楚了。我变得更聪明了,但对文档并不完全满意。当它说“仅当表是序列时才定义长度”时,它还应该说明即使表不是序列也会返回一个值,但行为 是未定义的。此外,这张表看起来很像一个序列:

a = setmetatable(
{0},
{
__index = function(t,k)
return k < 10 and k or nil
end
}
)
i = 1
while a[i] do
print(a[i])
i = i+1
end
--[[ prints:
0
2
3
4
5
6
7
8
9
]]
print(#a)
-- prints: 1

然而,这变得很挑剔,因为很明显,考虑 __index 可能造成的困惑是没有意义的。 Stackoverflow 当然不是提示文档更精确的地方。

最佳答案

正如您所注意到的,长度运算符的规范在 5.1 和 5.2 之间发生了变化。

Can I be entirely certain that Lua always returns 0 for the example table, or any other table containing only negative indices?

您可以针对当前的引用实现,这确保为 ilen 定义

function ilen (xs) 
local i=0
while xs[i+1] do i=i+1 end
return i
end

我们总是有 #xs >= ilen(xs) - 请参阅 the ltable.c source 中 luaH_getn 的定义.但是规范现在故意不 promise 这种行为:一致的实现可以返回 nil 或引发异常以尝试查找不是序列的表的长度。

关于lua - Lua 的长度运算符可能会返回负索引吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16021813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com