Lua学习笔记

2.5k 词

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 (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]

  1. 除了nil,都可以作为表项的键和值
  2. 给一个表项的值赋nil意味着从表中删除这一项,比如令b.x = nil,则把表b中键为“x”的项删除。
  3. 如果访问一个不存在的表项,其值也是nil,比如有c = a.b,但表a中没有键为“b”的项,则c等于nil。
  4. 键值对之间使用等号。

字符串

字符串的链接..

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 (args)
print (args.first .. args.last)
end
foo{first="hello", last="world"}

元表及元方法

Lua 中的每个值都可以有一个元表。 这个元表就是一个普通的 Lua 表, 它用于定义原始值在特定操作下的行为。 如果你想改变一个值在特定操作下的行为,你可以在它的元表中设置对应域。 例如,当你对非数字值做加操作时, Lua 会检查该值的元表中的 “__add” 域下的函数。 如果能找到,Lua 则调用这个函数来完成加这个操作。