table

table 没有固定大小,可动态添加。
关联数组,通过整数索引,字符串或其它类型的值(除了nil之外)来索引.

lua也通过table来表示模块,包和对象。

lua中没有也无法声明table, table的创建通过构造表达式 {}

table永远是 匿名的,一个持有table的变量和table自身自荐没有固定的关联性,
当程序没有对一个table的引用,gc就会回收删除该table.

t = {}
for i = 1, 1000 do t[i] = i * 2 end
语法糖: a["name"] -> a.name

若要表达一个传统的数组或线性表 ,只需要以整数作为key来使用table即可。

长度操作符 #t
lua 将 nil作为数组结尾的界定符, #t 并非安全
table.maxn() 返回一个table的最大正索引数

数字0和字符串“0” 的索引值 是不同的,

字符串转换数字: tonumber("1") -> 1

% 取模 : x % 1 -> 取x的小数部分
^ 指数 : x ^ 3 ->

不相等: ~=
对于 table,userdata和 函数,lua作引用比较,只有引用同一个对象,才认为相等。


逻辑操作符 and or not
false和nil视为假, 其它任何东西都为真

and -> 如果它的第一个操作数为假, 就返回第一个操作数,不然返回第二个操作数
or -> 如果它的第一个操作数为真, 就返回第一个操作数,不然返回第二个操作数

x = x or v 等价于 if not x then x = v end

字符串连接: 所有的字符串都不可变
print(0 .. 1) -> 01

数组风格:days = { "Sun", "Mon", "Tues" } -> days[1] -> "Sun" 索引从1开始
记录风格:point = { x = 10, y = 20}

每当lua评估一个构造式,都会先创建一个新的table,然后初始化它。
list = nil // 链表
for line in io.readlines() do
list = { next = list, value = line }
end


多重赋值 x, y = y, x 交互两个变量, lua总是先对右边的所有元素求值,然后再执行赋值语句。

local描述的局部变量,否则就是全局变量。

数字型for: for i = 1,10 do ... end
泛型for: for i, v in iparis(t) do ... end
for k, v in paris(t) do ... end

冒号操作符:o:foo(x) -> o.foo(self, x)

函数调用:若实参多于形参,则舍弃多余的实参;
若实参不足,则多余的形参初始化为nil

多重返回值 return a, b

function unpack(t, i)
i = i or 1
if t[i] then
return t[i], unpack(t, i+1)
end
end

变长参数
function foo ( ...)
local a, b, c = ...
end

通常一个函数在遍历其变长参数时只需使用表达式 {...}
select(n, ...) 访问第n个可变实参
select('#', ...) 返回可变参数的总数

具名参数


table.insert
table.remove

function Set (list)
local set = {}
for _, l in iparis(list) do set[l] = true end
return set
end

bag -> 多重集合Multiset
在set的基础上,需要将一个计数器与table的key关联:
function insert (bag, element)
bag[element] = (bag[element] or 0) + 1
end

function remove (bag, element)
local count = bag[element]
bag[[element] = (count and count > 1) and count -1 or nil
end


local t = {}
for line in io.lines() do
t[#t + 1] = line
end
t[#t + 1] = ""
s = table.concat(t, "\n")


function add_string (stack, s)
stack[#stack + 1] = s
for i = #stack - 1, 1, -1 do
if #stack[i] > #stack[i + 1] then
break
end
stack[i] = stack[i] .. stack[i + 1]
stack[i + 1] = nil
end
end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值