Lua 学习笔记之C API 遍历 Table实现代码

时间:2023-02-01 08:05:12 其他范文 收藏本文 下载本文

Lua 学习笔记之C API 遍历 Table实现代码(集锦2篇)由网友“小棉袄”投稿提供,下面就是小编给大家带来的Lua 学习笔记之C API 遍历 Table实现代码,希望大家喜欢阅读!

Lua 学习笔记之C API 遍历 Table实现代码

篇1:Lua 学习笔记之C API 遍历 Table实现代码

作者:TimothyQiu 字体:[增加 减小] 类型:

这篇文章主要介绍了Lua 学习笔记之C API 遍历 Table实现代码,需要的朋友可以参考下

Lua 通过一个虚拟栈与 C 的交互,正数索引自底向上取值,负数索引自顶向下取值,

Lua 中的 Table(表)结构可以使用任何数据作为 key 进行取值。使用 C API 访问 Table 中的元素有两种方法:

代码如下:

lua_getglobal(L, t);

lua_pushinteger(L, k); -- 这里可以换成其它类型的 lua_pushXXXX(L, k) 压数据到栈顶作key

lua_gettable(L, -2);

lua_getglobal(L, t);

lua_getfield(L, -1, k);

在结束时,栈上的情况均为:栈顶为 t[k],次顶元素为 Table 类型的 t。第二种方法其实是第一种方法在「key 为字符串」时的特殊写法。

C API 遍历 Table

代码如下:

lua_getglobal(L, t);

lua_pushnil(L);

while (lua_next(L, -2)) {

/* 此时栈上 -1 处为 value, -2 处为 key */

lua_pop(L, 1);

}

lua_next 函数针对 -2 处(参数指定)的 Table 进行遍历,

弹出 -1 处(栈顶)的值作为上一个 key(为 nil 时视为请求首个 key),压入 Table 中的下一个 key 和 value。返回值表示是否存在下一个 key。

另外在循环中处理值时要记得随时清理栈,否则 Table 就不在 -2 了。(也可以考虑在 lua_getglobal 后用 lua_gettop 存下 Table 的正数索引。)

虽然这是手册中记载的遍历方法,但这种方法在遍历时并没有一定的遍历顺序,于是便又有了下面的方法。

用整数 Key 进行并不那么完美的遍历

代码如下:

lua_getglobal(L, t);

len = lua_objlen(L, -1);

for (i = 1; i <= len; i++) {

lua_pushinteger(L, i);

lua_gettable(L, -2);

/* 此时栈顶即为 t[i] 元素 */

lua_pop(L, 1);

}

这种方法无视了非整数 key,但可以保证遍历顺序。如果只关注整数 key,可以考虑用这种遍历方法 :)

篇2:Lua table类型学习笔记

这篇文章主要介绍了Lua table类型学习笔记,本文讲解了table的基础知识和table库函数的使用以及面向对象编程实例,需要的朋友可以参考下

关系表类型,这是一个很强大的类型,我们可以把这个类型看作是一个数组。只是 C语言的数组,只能用正整数来作索引; 在Lua中,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。同样,在C语言中,数组的内容只允许一种类型;在 Lua中,你也可以用任意类型的值来作数组的内容,nil也可以。

基本介绍

注意三点:

第一,所有元素之间,总是用逗号 “,” 隔开;

第二,所有索引值都需要用 “[”和“]” 括起来;如果是字符串,还可以去掉引号和中括号; 即如果没有[]括起,则认为是字符串索引

第三,如果不写索引,则索引就会被认为是数字,并按顺序自动从 1往后编;

例如:

代码如下:

tt = {“hello” ,33}

value = 4

tab = {[tt] = “table”,key = value, [“flag” ] = nil, 11}

print(tab[tt])

print(tab.key)

print(tab[1 ])

以上写法都是对的。

look = {[www] = “ok”}这样是不对的,www没有赋值,所以默认为nil因此出错table index is nil

代码如下:

---

temp = 1

tab = {[temp] = 1, 11}

print(tab[temp]) --此时的结果是11,因为11没有显式对应的key,因此从1开始,如果前面定义了,则覆盖其value

代码如下:

---

temp = 2

tab = {[temp] = 1, 11}

temp = 1

print(tab[temp]) -- 结果是11,虽然定义时[temp] = 1,但是后来我们改变了temp的值,所以指向另外的key了

以上可知:

1.对于字符串,在{}定义时,可以key = value, 也可以[“flag”] = nil,索引都是string类型,对于非nil类型变量(包括字符串),都可以[variable]=value的方式

2.使用table时,对于字符串,可以通过.的方式访问,也可以通过[]方式访问。tab[a],tab[b],只要a==b那么tab[a]可以访问到tab[b]的值

3.不管定义索引时用的是常量还是变量,最终table中value的索引key是常量,不会随变量的改变而变化该value的key

嵌套

代码如下:

tb11= {tb12 = {bool = true}} -- simple, it‘s a table IN a table :)

-- Call magic!

print(tb11.tb12.bool ) -- works fine, since it‘s calling the key and value correctly.

print(tab11[“tb12” ].bool ) --same as line 33

print(tab11.tb12 [“bool”]) --same as line 33

print(tab11[“tb12” ][“bool”]) --same as line 33

修改table的value

代码如下:

--Altering a table‘s content. Basically manipulating the values of the keys.

lucky= {john=“chips” ,jane =“lemonade”,jolene=“egg salad” }

lucky.jolene = “fruit salad” --changed the value to “fruit salad” instead of “egg salad”

lucky.jerry = “fagaso food” -- adding a new key-value pair to the container lucky.

lucky.john = nil -- remove john from giving anything or from being a key.

table的易变性

代码如下:

a = {}; b = a;

print(a == b) -->true

c,d = {},{};

print(c == d) -->false

table库函数使用

-----------------------------------------------------------

1. table.sort (table [, comp])

Sorts table elements in a given order, in-place, from table[1] to table[n], where n is the length of the table. If comp is given, then it must be a function that receives two table elements, and returns true when the first is less than the second (so that not comp(a[i+1],a[i]) will be true after the sort). If comp is not given, then the standard Lua operator < is used instead.

The sort algorithm is not stable; that is, elements considered equal by the given order may have their relative positions changed by the sort.

代码如下:

name = {“you” ,“me”, “him”,“bill” }

--table.sort - only works with arrays!

table.sort(name)

for k, v in ipairs( name) do

print( k,v)

end

--table.sort uses callbacks. a function that is writtent to be called by a library function.

function cmp( a, b)

if string.sub(a,2 ,2) < string.sub(b,2 ,2) then

return true

else

return false

end

end

table.sort(name, cmp)

for k, v in ipairs( name) do

print( k,v)

end

2. 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 so that a call table.insert(t,x) inserts x at the end of table t.

代码如下:

--table.insert --an easy to copy a table to another table or adding elements to an array.!

foo = {“a” ,“c”, “d”}

bar = {}

function printt( table)

for i=1 ,#table do

print(i,table [i ])

end

end

print(“before insert:” )

printt(foo)

table.insert(foo,2 ,“b”)

print(“after insert” )

printt(foo)

3. table.concat (table [, sep [, i [, j]]])

Given an array where all elements are strings or numbers, returns table[i]..sep..table[i+1] ・・・ sep..table[j]. The default value for sep is the empty string, the default for i is 1, and the default for j is the length of the table. If i is greater than j, returns the empty string.

代码如下:

--table.concat does what it implies. Takes an array and concates to one string.

num = {1 ,2, 3,4,5 ,6}

print(table.concat (num ,“<”))

4. 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.

代码如下:

abc = {“a” ,“b”, “c”}

print(table.remove (abc ,2))

print(“abc length = ” .. #abc)

5. 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.)

--table.maxn

代码如下:

apple = {“a” ,“p”,[ 5]=“e”}

print(table.maxn (apple )) -- 5

duck = {[-2 ]=3,[- 1]=0}

print(table.maxn (duck )) -- 0

面向对象编程

代码如下:

--note for a object to work, it needs a closure(inner function with an upvalue(a local value from a higher scope))

--note: the more closures made, the slower the program would run.

function mg1( n)

local function get ()

return n ;

end

local function inc (m )

n = n +m ;

end

return {get = get, inc= inc}

end

bject = mg1(50 )

print(object.get ())

print(object[“get” ]())

object.inc(2 )

print(object.get ())

----------------------------------------

do

local function get (o )

return o.one

end

local function inc (self , two )

self.one = self.one + two

end

function mg3 (one )

return {one = one , get = get , inc = inc }

end

end

a = mg3(50 )

a:get()

a.inc(a,2 )

print(a:get())

----------------------------------------

do

local T = {};

function T:get()

return self.n ;

end

function T:inc(m)

self.n = self.n + m ;

end

function mg4 ( n )

return {n = n , get =T.get , inc =T.inc }

end

end

c = mg4(30 )

print(c:get())

c:inc(4 )

print(c:get())

(完)

flex 遍历Object对象内容的实现代码

Lua数据类型介绍

Lua教程(十七):C API简介

c语言函数知识点总结

第六章 计划与计划工作 学习笔记

Lua时间转化的几个小例子

程序开发中异常的理解及处理异常论文

nosql数据库 tiger

Lua的编译、执行和调试技术介绍

详解Lua中repeat...until循环语句的使用方法

Lua 学习笔记之C API 遍历 Table实现代码
《Lua 学习笔记之C API 遍历 Table实现代码.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【Lua 学习笔记之C API 遍历 Table实现代码(集锦2篇)】相关文章:

FreePOPs实现Gmail客户端收信2022-11-13

Linux内核分析 网络[十一]:ICMP模块2022-05-06

C语言中函数的返回值2022-12-19

Mustache.js前端引擎源码解读2023-07-10

腾讯实习生笔试经验谈2022-08-07

通用菜单生成程序.net2022-05-08

腾讯的笔试通过率高吗?2023-03-23

分拆统计字符串数据库教程2023-11-21

腾讯实习生web前端笔试经验2022-12-08

腾讯实习生求职笔试面试经历2022-07-26

点击下载本文文档