Lua
Lua在设计上,从一开始就把简洁、高效、可移植性、可嵌入型、可扩展性等作为自己的目标。
数据类型
表、函数、线程、以及完全用户数据在 Lua 中被称为对象:变量并不真的持有它们的值,而仅保存了对这些对象的引用。 赋值、参数传递、函数返回,都是针对引用而不是针对值的操作, 这些操作均不会做任何形式的隐式拷贝。
基本类型 | 描述 | |
---|---|---|
数值(number) | 内部以double表示 | |
字符串(string) | 总是以零结尾,但可以包含任意字符(包括零),因此并不等价于C字符串, 而是其超集 | |
布尔(boolean) | 只有“true”或者“false”两个值。nil → false,others → true | |
函数(function) | Lua的关键概念之一。不简单等同于C的函数或函数指针。 | |
表(table) | 异构的Hash表。Lua的关键概念之一。 | |
userdata | 用户(非脚本用户)定义的C数据结构。脚本用户只能使用它,不能定义。 | |
线程(thread) | Lua协作线程(coroutine),与一般操作系统的抢占式线程不一样。 | |
nil | 为初始化的值,逻辑值为false。 |
and 且&& or 或|| not 取反!
函数
- 函数用关键字function定义函数,以关键字end结束
- 局部变量用关键字local定义。如果没有用local定义,即使在函数内部定义的变量也是全局变量!
- 函数可以返回多个值:
1
2
3
4
function foo(a,b,c,...)
local sum = a+b
return sum,c --函数可以返回多个值
end
表
定义表(Table)的方式
1
local b = { x = 1, ["hello"] = "world!" }
访问表的成员 通过“.”或者“[]”运算符来访问表的成员。 1. 注意:表达式a.b等价于a[“b”],但不等价于a[b]
- 除了nil,都可以作为表项的键和值
- 给一个表项的值赋nil意味着从表中删除这一项,比如令
b.x = nil
,则把表b中键为“x”的项删除。 - 如果访问一个不存在的表项,其值也是nil,比如有c = a.b,但表a中没有键为“b”的项,则c等于nil。
- 键值对之间使用等号。 </b>
字符串
字符串的链接..
1
local str = "Hi " .. "Lua" -- Hi Lua
字符串的截取,索引从1开始
1
string.sub(str, fromIndex [, endIndex])
1
2
3
4
5
string.sub("Hello Lua user", 7) -- Lua user
string.sub("Hello Lua user", 7, 9) -- Lua
string.sub("Hello Lua user", -8) -- Lua user
string.sub("Hello Lua user", -8, 9) -- Lua
string.sub("Hello Lua user", -8, -6) -- Lua
常用方法
1
2
3
4
5
string.len("Alma") -- "4"
string.format("%d %s", 2, "alma") -- "2 alma"
string.upper("Alma") -- "ALMA"
string.lower("Alma") -- "alma""
string.reverse("Alma") -- " amlA"
简写格式
1
2
3
mystring = "alma"
print(#mystring==mystring:len()) -- true
print(mystring:reverse()) -- "amla"
1
2
3
4
math.pow(x,y) -- x的y次方
math.sqrt(x) -- 平方根
math.max(...)
math.min(...)
表
键值为变量或者数字必须用[]
括起来 可以用逗号和分号分割 字符串引号可以被省略
1
2
3
4
5
6
7
empty = {}
myint = 42;
mystring = "China";
table = { ['hi'] = "lua", from = mystring; [empty] = "empty", [myint] = 100 }
for k, v in pairs(table) do
print(k,v)
end
表是 Lua 中唯一的数据结构, 它可被用于表示普通数组、序列、符号表、集合、记录、图、树等等。 对于记录,Lua 使用域名作为索引。 语言提供了 a.name 这样的语法糖来替代 a[“name”] 这种写法以方便记录这种结构的使用。
table[“k”]==table.k print(table.from) print(table[‘from’])
1
2
3
4
5
6
7
8
array = {'a', 'b', 'c'}
print (#array) -- 3 #计算长度
for k,v in ipairs(array) do
print(k,v)
end
--1 a
--2 b
--3 c
ipairs 隐式索引,从一开始,索引都为正整数
函数
1
2
3
4
5
6
7
8
9
10
function f(...) -- any number of parameters
a,b = ...
print(a,b,...)
end
f(1,2,3) -- 1 2 1 2 3
function foo(args)
print (args.first .. args.last)
end
foo{first="hello", last="world"}
元表及元方法
Lua 中的每个值都可以有一个元表。 这个元表就是一个普通的 Lua 表, 它用于定义原始值在特定操作下的行为。 如果你想改变一个值在特定操作下的行为,你可以在它的元表中设置对应域。 例如,当你对非数字值做加操作时, Lua 会检查该值的元表中的 “__add” 域下的函数。 如果能找到,Lua 则调用这个函数来完成加这个操作。