2015-03-25 6 views
2

У меня вопрос, когда я использую # для вычисления длины таблицы. Для примера:использовать оператор «#» для вычисления длины таблицы в Lua?

local t = {"a", "b"} 
local t1 = {"a", nil} 
print(#t)  -- 2 
print(#t1)  -- 1 

local t = {"a", "b"} 
local t1 = {nil, "a"} 
print(#t)  -- 2 
print(#t1)  -- 2 

кто-то может сказать мне, почему это?

ответ

2

За исключением случаев, когда __len определяется метаметом, оператор # может работать только на столе, который является последовательностью.

Последовательность представляет собой таблицу, в которой набор ее положительных цифровых клавиш равен {1..n} для некоторого неотрицательного целого числа n.

В вашем примере:


local t = {"a", "b"} 

t представляет собой последовательность, которая имеет длину 2.


local t1 = {"a", nil} 

эквивалентно local t1 = {"a"}, поэтому t1 представляет собой последовательность, которая имеет длину 1.


local t1 = {nil, "a"} 

t1 не является последовательностью, поэтому #t1 не определен.

+0

local t1 = {nil, "a"} t1 не является последовательностью, доза означает, что # t1 возвращает неправильную длину. – user1723404

+0

@ user1723404 Нет согласованной «правой» длины для таблицы, которая не является последовательностью. На практике для не-последовательности Lua может возвращать разные результаты для таблиц, имеющих одни и те же записи. Например, если вы проверите 'local t1 = {nil," a "}; print (# t1) 'вы, вероятно, получите' 2'. Но если вы проверите 'local t1 = {}; т [1] = ноль; т [2] = "A"; print (# t1) 'вы, вероятно, получите' 0'. – tehtmi

+0

@ user1723404 '# t1' не определен, значит нет его * правильного * значения. В частности, возможно, что вы получаете различную ценность в разных реализациях Lua. –

Смежные вопросы