Lua table

Lua的table提供了Map的功能,实现了"关联数组",并且整数、字符串甚至nil都可以作为索引/key;table没有固定的大小。

  

基于table,可以表示普通数组、符号表、集合、记录、队列和其他数据结构。

  

而Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。

例如io.read表示使用"read"来索引table io。

  

在Lua中,table既不是值也不是"变量",而是对象,可以类比Java中的数组

  

table是通过构造表达式的,最简单的就是{}

> a={}

> a['name'] = 'wyj'

> =a.name

wyj

  

table永远是匿名的,一个持有table的变量与table自身没有固定的关联性:

> b = a

> b.name = 'ljq'

> =a.name

ljq

> b = nil

> =a.name

ljq

  

b['name']和b.name等价,而对于数字只能使用b['3']的形式,同Javascript。

  

同其他对象一样,当没有table的引用时,Lua的垃圾回收器最终回收table。

  

其实Lua将全局变量存储在一个table中。

  

table的长度可以通过#获取(#还可以获取字符串的长度)

> table = {}

> for i = 1,10 do

>> table[i] = i

>> end

> =#table

10

  

但不是所有情况都适用

> table = {}

> table[3] = 3

> table.name = 'wyj'

> =#table

0

  

实际上,在第一次碰到nil时,就认为是结束标志

> table = {}

> table[10] = 10

> =#table

0

> table[1] = 1

> =#table

1

这一点,不同于Javascript的数组长度的行为。

  

  

上面提到构造表达式{},介绍一下复杂一点的构造表达式:

a = {'wyj', 'lmy'}

a= {x = 10, y = 20,l='s'}

 

但是下面的方式不正确

> a={1=3}

stdin:1: '}'expected near '='

> a={'x'=3}

stdin:1: '}'expected near '='

而应该这样使用:

> x = {[1] = 3,['name'] = 'www'}

> =x[1]

3

> =x.name

www

 

 

table还可以嵌套

> a = {x = {y =1}}

> =a.x.y

1

 

更复杂的方式,可以调用函数初始化

> x ={math.sin(3)}

> =x[1]

0.14112000805987

 

另外需要特别注意的是,无label的项会自动生成整数的label

> x = {1, 2, [2]=3, 4,5}

> =x[1]

1

> =x[2]

2

> =x[3]

4

所以,显式的label为整数的情况下要特别小心。

 

另外支持用;替换,

>x={x=1;y=2; 'one', 'two'}

> xx

1

> =x[1]

one

 

unpack

NoteGem Horizontal Line

内置函数unpack可以提取key1.2.3...的元素

> t = {x=3,y=4,5,6,7}

> unpack(t)

> =unpack(t)

5        6        7

> a,b,c = unpack(t) --Lua支持多重赋值

> print(a,b,c)

5        6        7

 

> functionsum(a,b,c)

>> return a +b + c

>> end

> =sum(unpack(t))

18

 

  

  

<think>嗯,用户想了解Luatable的用法和相关编程问题。首先,我需要回顾Luatable基本概念,比如如何创建、初始化,以及常用操作。记得Luatable既是数组又是字典,索引可以从1开始,这点要特别说明。然后,高级特性比如元表、迭代器、面向对象模拟也很重要。要举例说明,比如如何用table实现队列或者类。 接下来,用户可能遇到的常见问题有哪些呢?比如深拷贝与浅拷贝的区别,table的性能优化,还有与C语言的交互。这些问题需要结合引用中的内容,比如引用[1]提到Lua作为独立语言,引用[2]中的arg表结构,引用[3]的加载字符串方法,引用[4]的模块限制。这些引用可能和table的使用场景相关,比如在脚本参数传递中使用table,或者在非阻塞I/O限制下的使用。 还要注意用户提到的系统级指令,比如数学公式的格式,但用户的问题是关于编程的,可能不需要数学公式。不过要确保回答结构清晰,分点说明,并生成相关问题。比如用户可能想知道如何高效合并table,或者如何处理table的元方法冲突。需要确保回答覆盖基本用法和常见问题,同时引用相关文献中的例子,比如arg表的构造,或者lua_pcall的使用场景。</think>### Lua中的Table用法及编程问题解析 #### 一、Table基础用法 1. **创建与初始化** Luatable支持动态创建和混合类型存储: ```lua -- 空表 local t1 = {} -- 数组形式(索引默认从1开始) local arr = {"a", "b", 3, x = 5} print(arr[1]) --> "a" [^2] -- 字典形式 local dict = {name = "Lua", version = "5.4"} print(dict.name) --> "Lua" ``` 2. **特殊索引规则** - 数字索引从1开始(符合Lua惯例) - 支持任意类型作为键,包括函数和table ```lua local t = { [print] = "function key", [{1,2}] = "table key" } ``` #### 二、高级特性 1. **元表(Metatable)** 通过元表实现运算符重载和元方法: ```lua local vec1 = {x=1, y=2} local vec2 = {x=3, y=4} local mt = { __add = function(a,b) return {x=a.x+b.x, y=a.y+b.y} end } setmetatable(vec1, mt) print((vec1 + vec2).x) --> 4 ``` 2. **面向对象编程** 使用table模拟类和继承: ```lua local Animal = {} function Animal:new(name) local obj = {name = name} setmetatable(obj, {__index = self}) return obj end function Animal:speak() print(self.name.." makes sound") end local Cat = Animal:new() function Cat:speak() print(self.name.." says meow") end ``` #### 三、常见问题解决方案 1. **深拷贝问题** 标准table库仅提供浅拷贝,深拷贝需要递归实现: ```lua function deepcopy(obj) if type(obj) ~= "table" then return obj end local copy = {} for k,v in pairs(obj) do copy[deepcopy(k)] = deepcopy(v) end return copy end ``` 2. **性能优化** - 预分配数组空间可提升性能: ```lua local arr = {} for i=1,1000 do arr[i] = 0 -- 动态扩展会触发多次内存分配 end ``` - 改为: ```lua local arr = {} arr[1000] = 0 -- 预分配空间 for i=1,1000 do arr[i] = 0 end ``` 3. **与C交互** 当嵌入C程序时,注意引用管理: ```c // 创建Lua table lua_newtable(L); lua_pushstring(L, "value"); lua_setfield(L, -2, "key"); // 设置table元素[^3] ``` #### 四、特殊应用场景 1. **配置解析** 利用table结构表达层级配置: ```lua config = { server = { port = 8080, hosts = {"192.168.1.1", "192.168.1.2"} } } ``` 2. **命令行参数处理** Lua解释器自动创建arg表存储参数: ```lua -- 执行 lua -la b.lua t1 t2 时 arg = { [-2] = "lua", [-1] = "-la", [0] = "b.lua", [1] = "t1", [2] = "t2" } [^2] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值