lua table integer index 特性

table.maxn (table)

Returns the largest positive numerical index of the given table, or zero if the table has no positive numerical indices. (To do its job this function does a linear traversal of the whole table.)

返回表中最大的正数值index。

说明:

1、 此接口不是统计表中元素的数目。

2、 如果表中 positive numerical index 不是连续的,  12  4, 缺少3为index的元素, 计算值为 maxn为 4。

local test = {1}

table.insert(test, {})
table.insert(test, 4, {})

print("table.maxn(test)="..table.maxn(test))

for i,v in pairs(test) do
    print("i="..i.." v="..tostring(v))
end

LOG:

>lua -e "io.stdout:setvbuf ‘no‘" "luatest.lua"
table.maxn(test)=4
i=1 v=1
i=2 v=table: 00559670
i=4 v=table: 005597B0

FOR IPAIRS vs Non Positive Integer Index

对于不连续的 positive integer index情况, 如果使用 ipairs 迭代器, 只能获取第一个连续的index段。

故不能遍历所有元素, 如果需要则使用 pairs迭代器。

local test = {1}

table.insert(test, {})
table.insert(test, 4, {})

print("table.maxn(test)="..table.maxn(test))

for i,v in ipairs(test) do
    print("i="..i.." v="..tostring(v))
end

LOG:

>lua -e "io.stdout:setvbuf ‘no‘" "luatest.lua"
table.maxn(test)=4
i=1 v=1
i=2 v=table: 00339580

table.remove (table [, pos])

Removes from table the element at position pos, shifting down other elements to close the space, if necessary. Returns the value of the removed element. The default value for pos is n, where n is the length of the table, so that a call table.remove(t) removes the last element of table t.

删除pos位置元素, 并将左边的高index元素向左移动一个位置。  此处所指的高index是指左侧所有的 元素, 故 maxn值会减少1.

local test = {1}

table.insert(test, {})
table.insert(test, 4, {})

print("table.maxn(test)="..table.maxn(test))

for i,v in pairs(test) do
    print("i="..i.." v="..tostring(v))
end

table.remove(test, 1)

print("table.maxn(test)="..table.maxn(test))

for i,v in pairs(test) do
    print("i="..i.." v="..tostring(v))
end

LOG:

>lua -e "io.stdout:setvbuf ‘no‘" "luatest.lua"
table.maxn(test)=4
i=1 v=1
i=2 v=table: 00589350
i=4 v=table: 005892B0
table.maxn(test)=3
i=1 v=table: 00589350
i=3 v=table: 005892B0
>Exit code: 0

table.insert (table, [pos,] value)

Inserts element value at position pos in table, shifting up other elements to open space, if necessary. The default value for pos is n+1, where n is the length of the table (see §2.5.5), so that a call table.insert(t,x) inserts x at the end of table t.

将元素value插到pos位置, 此位置以及以上的元素都向右边移动一位。 会将maxn值加1.

local test = {1}

table.insert(test, {})
table.insert(test, 4, {})

print("table.maxn(test)="..table.maxn(test))

for i,v in pairs(test) do
    print("i="..i.." v="..tostring(v))
end

table.insert(test, 1, 33)

print("table.maxn(test)="..table.maxn(test))

for i,v in pairs(test) do
    print("i="..i.." v="..tostring(v))
end

LOG:

>lua -e "io.stdout:setvbuf ‘no‘" "luatest.lua"
table.maxn(test)=4
i=1 v=1
i=2 v=table: 00979800
i=4 v=table: 009795F8
table.maxn(test)=5
i=1 v=33
i=2 v=1
i=3 v=table: 00979800
i=5 v=table: 009795F8
>Exit code: 0

table.remove vs nil set

nil 不会做 将右边的元素向左移动一位的动作, remove会。

local test = {1}

table.insert(test, {})
table.insert(test, 4, {})

print("table.maxn(test)="..table.maxn(test))

for i,v in pairs(test) do
    print("i="..i.." v="..tostring(v))
end

test[1] = nil

print("table.maxn(test)="..table.maxn(test))

for i,v in pairs(test) do
    print("i="..i.." v="..tostring(v))
end

LOG:

>lua -e "io.stdout:setvbuf ‘no‘" "luatest.lua"
table.maxn(test)=4
i=1 v=1
i=2 v=table: 003D9508
i=4 v=table: 003D9580
table.maxn(test)=4
i=2 v=table: 003D9508
i=4 v=table: 003D9580
>Exit code: 0

时间: 2024-10-14 10:38:47

lua table integer index 特性的相关文章

Lua table pair和ipair区别

官方描述: ipairs (t) Returns three values: an iterator function, the table t, and 0, so that the construction for i,v in ipairs(t) do body end will iterate over the pairs (1,t[1]), (2,t[2]), ···, up to the first integer key absent from the table. pairs (

Lua table转C++数组

为了方便,这里数组用vector表示. C++层代码如下: static int LuaTable2Vector(lua_State *luaState) { int count = luaL_getn(luaState, 1); std::vector<std::string> vecNameList; for (int i = 0; i < count; i++) { lua_rawgeti(luaState, 1, i+1); const char *strName = lua_t

【游戏开发】在Lua中实现面向对象特性——模拟类、继承、多态

一.简介 Lua是一门非常强大.非常灵活的脚本语言,自它从发明以来,无数的游戏使用了Lua作为开发语言.但是作为一款脚本语言,Lua也有着自己的不足,那就是它本身并没有提供面向对象的特性,而游戏开发是一项庞大复杂的工程,如果没有面向对象功能势必会为开发带来一定的不便.不过幸好Lua中有table这样强大的数据结构,利用它再结合元表(metatable),我们便可以很方便地在Lua中模拟出类.继承和多态等面向对象编程具有的特性. 二.前提知识 按照惯例,我们还是先来熟悉一下必要的前提知识,以便方便

Lua table 的长度问题

直入主题 我们要取lua table的长度时习惯这样 local tb = {1,2,3,4} print(#tb) 这时候,输出理所当然的是4,如果在程序中我们需要判断长度时使用这样的方法,再看一下 tb[1] = nil print(#tb) 输出还是4,似乎有点背离我们的意愿 我们想知道这个table里面是不是有4个值,但是有一个值被置空了,输出结果却没有及时告诉我们 发生这样问题的原因是,lua在初始化table的时候,会给这个table分配值存储的空间,代码里面tb初始化包含4个数字值

查看Table的Index

1,查看table中的index的定义 SELECT o.object_id, o.name, i.index_id, i.name as index_name, i.type_desc as index_type, ic.index_column_id, c.name AS columnname, iif(ic.is_descending_key=1,'desc','asc') as sort_direction, ic.key_ordinal as index_key_ordinal, ic

转:Sql Server中的表访问方式Table Scan, Index Scan, Index Seek

0.参考文献 Table Scan, Index Scan, Index Seek SQL SERVER – Index Seek vs. Index Scan – Diffefence and Usage – A Simple Note oracle表访问方式 Index Seek和Index Scan的区别以及适用情况 1.oracle中的表访问方式 在oracle中有表访问方式的说法,访问表中的数据主要通过三种方式进行访问: 全表扫描(full table scan),直接访问数据页,查找

树形打印lua table表

local print = print local tconcat = table.concat local tinsert = table.insert local srep = string.rep local type = type local pairs = pairs local tostring = tostring local next = next function print_lua_table (lua_table, indent) if not lua_table or t

(转) 关于lua table是否为空的判断

在项目的脚本lua中经常有这样的需求, 1.local a = {} 2.对a进行处理 3.对a是否为空表进行判断 关于对a是否为空表的判断,我发现有些代码如此做: if a == {} then 这样的结果就是a == {}永远返回false,是一个逻辑错误.因为这里比较的是table a和一个匿名table的内存地址. 也有些代码如此做: if table.maxn(a) == 0 then 这样做也不保险,除非table的key都是数字,而没有hash部分. 难道真的要遍历table发现有

9.6 翻译系列:数据注解之Index特性【EF 6 Code-First系列】

原文链接:https://www.entityframeworktutorial.net/entityframework6/index-attribute-in-code-first.aspx EF 6提供了Index特性,用来在特定的列上面创建索引. class Student { public int Student_ID { get; set; } public string StudentName { get; set; } [Index] public int Registration