如果你不了解Lua,请参考《Lua基础》
Table
Table非常灵活,是Lua中唯一的数据结构。
x = 5
a = {} -- 空表
b = { key = x, anotherKey = 10 } -- 字符串作键
c = { [x] = b, ["string"] = 10, [34] = 10, [b] = x } -- 变量和字面量作键
-- 赋值
a[1] = 20
a["foo"] = 50
a[x] = "bar"
-- 获取
print(b["key"]) -- 5
print(c["string"]) -- 10
print(c[34]) -- 10
print(c[b]) -- 5
语法糖
用字符串作键可以享受如下语法糖:
t = { foo = 1, bar = 2 }
print(t.foo) -- 1
t.bar = 3
数组
a = { 11, 22, "foo", "bar" }
a[3] = "foooo"
print(a[1]) -- 11
print(a[3]) -- foooo
print(#a) -- 4
注意,从1开始计数。
for
循环
for
循环可以用于任何返回迭代函数的值。
a = { x = 400, y = 300, [20] = "foo" }
b = { 20, 30, 40 }
for key, value in pairs(a) do
print(key, value)
end
for index, value in ipairs(b) do
print(index, value)
end
上面的代码输出如下:
y 300
x 400
20 foo
1 20
2 30
3 40
table模块
Lua的table
模块很有用:
t = { 24, 25, 8, 13, 1, 40 }
table.insert(t, 50) -- 附加50
table.insert(t, 3, 89) -- 在索引3处插入89
table.remove(t, 2) -- 删除第2项
table.sort(t) -- 使用 < 运算符排序
字符串
可以使用单引号和双引号,以及反斜杠转义。[[...]]
用于多行字符串。
s = "foo\nbar"
t = 'he said "hello world"'
u = "Hello \"world\""
v = [[
Hello world!
]]
string
模块
标准库提供的模块。
string.lower("HeLLO") -- hello
string.upper("Hello") -- HELLO
string.reverse("world") -- dlrow
string.char(87) -- W
string.sub("hello world", 2, 5) -- ello
Lua的string模式类似正则表达式,但是语法不太一样,功能也弱一些:
string.gsub("hello 42", "(%d+)", "%1 3") -- hello 42 3
string.gsub("heLLo", "(%u)", "") -- heo
-- 4 + 4 = 8
string.gsub("2 + 2 = 4", "(%d)", function(s)
return s * 2
end)
-- 打印每个单词
for w in string.gmatch("good morning chaps", "%w+") do
print(w)
end
数字和数学
Lua中所有的数字都是双精度浮点型,因为双精度浮点型表示整数不会有取整误差,在现代的CPU上,效率也足够高。
4, 0.4, .4, 4.3, 0xFF, 0xA33FF0E, 8.7e12, 8.7e+12, 8e-12.
math
模块包含了很多数学函数,例如math.sin
、math.cos
、math.floor
等等。需要留心的是:
-
math.huge
是最大数。 - 有
math.floor
和math.ceil
,但是没有math.round
——可以用math.floor(x + .5)
代替。 -
math.random
可以生成伪随机数,调用前最后设置下math.randomseed
,例如math.randomseed(os.time())
。
下一步 Lua的函数和作用域
原文 Lua for Programmers Part 2: Data and Standard Libraries
翻译 SegmentFault