, ну, special specification of Lua's length operator заставило меня задаться вопросом Lua будет «разрешено» возвращать отрицательное значение в ситуации, какМожет ли оператор длины Lua возвращать отрицательный индекс?
#{[-5]=1,[-1]=3}
Он говорит:
Длина стола
t
определяется чтобы быть любым целым индексомn
таким образом, чтоt[n]
неnil
иt[n+1]
являетсяnil
;
n=-5
и n=-1
соответствует моему критерию в моем примере, не так ли?
кроме того, если это
t[1]
nil
,n
может быть равен нулю.
Право, это может быть равен нулю, но это не гарантировано, верно?
Для регулярного массива с не-nil значениями от 1 до заданного n его длина точно равна n, индексу последнего значения.
Это не тот случай, поэтому он не применяется.
Если массив имеет «дыры» (то есть,
nil
значения между другими значениями, не ноль), то #t может быть любой из индексов, которые непосредственно предшествует значение поnil
(то есть, он может рассматривать любое такое значениеnil
как конец массива).
Это тот случай, так что опять, n=-5
и n=-1
бы действительные возвращаемые значения, не так ли?
Могу ли я быть полностью уверенным, что Lua всегда возвращает 0 для таблицы примеров или любую другую таблицу, содержащую только отрицательные индексы? Если (гипотетически) я буду писать интерпретатор Lua и вернусь к любому из этих значений, буду ли я соответствовать спецификациям?
Редактировать
Очевидно, что путь Lua реализован, он не возвращает отрицательные значения. Я чувствовал, что оператор длины несколько недооценен, и я вижу, что документация Lua 5.2 изменилась. Он теперь говорит:
За исключением случаев,
__len
Метаметод не дается, длина таблицыt
определяется только если таблица является последовательность, то есть множество его положительных цифровых клавиш равно { 1..n} для целого числа n.В этом случае n - его длина. Обратите внимание, что таблица, как{10, 20, nil, 40}
не является последовательностью, поскольку она имеет ключевое
4
, но не имеет ключа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, конечно, не место, чтобы жаловаться на документацию, которая может быть более точной.
Учитываются только положительные целочисленные индексы. Отрицательные, дробные и нечисловые индексы могут содержать все, что не влияет на длину, возвращаемую оператором '#'. Возможно, руководство Lua должно быть изменено, чтобы быть более понятным. –
«... также должно быть указано, что даже если таблица не является последовательностью, возвращается значение, но поведение * не определено». Если поведение не определено, все ставки отключены, и это необязательно смысл сказать, что возвращается значение. –