Lua数据结构与标准库简介

如果你不了解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.sinmath.cosmath.floor等等。需要留心的是:

  • math.huge是最大数。
  • math.floormath.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

你可能感兴趣的:(入门,lua)