注释
- 单行注释
--abc
- 多行注释
--[[
--]]
运算符
1.一般运算符
= - * / ......
- 其他运算符
..: 字符串连接运算符
#: 返回字符串/表的长度
变量的增删改查
- ****访问没有初始化的变量, 会返回nil
- ****删除一个变量, 只需要赋值nil
- ****初始化变量无需指定类型
lua定义变量时无需指定类型, 变量的类型在被赋予值时被确定.
type(valName): 输出类型名
****变量类型
- boolean
false true. nil 和 false 都会导致条件判断为假; 而其它任何值都表示为真
2.table
table: 表类型. 类比于hashMap, 但是其key不限定类型.
示例:
①
abc1={}
②
abc2 = {"aa", "bb", "cc"}
abc2[1] == aa -- Lua 索引值是以 1 为起始
③
local myArray = {10, 20, 30, 40, 50}
for i = 1, #myArray do
print(myArray[i])
end
number: 代表了整数和实数(浮点数)
thread 类型表示了一个独立的执行序列,被用于实现协程 (参见 §2.6)。 Lua 的线程与操作系统的线程毫无关系。 Lua 为所有的系统,包括那些不支持原生线程的系统,提供了协程支持。
String: 字符串类型. "" . '' . [[]] 三种方式均可表示字符串
元表
在 Lua table 中我们可以访问对应的 key 来得到 value 值,但是却无法对两个 table 进行操作(比如相加)。
因此 Lua 提供了元表(Metatable),允许我们改变 table 的行为,每个行为关联了对应的元方法。
****元表相当于, 对table进行操作时, 执行自定义的函数
有两个很重要的函数来处理元表:
- ****setmetatable(table,metatable): 对指定 table 设置元表(metatable),如果元表(metatable)中存在 __metatable 键值,setmetatable 会失败。
- ****getmetatable(table): 返回对象的元表(metatable)。
- __index 元方法
-- 当通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
> other = { foo = 3 }
> t = setmetatable({}, { __index = other })
> t.foo
3
> t.bar
nil
Plain Text
- __tostring 元方法
mytable = setmetatable({ 10, 20, 30 }, {
__tostring = function(mytable)
sum = 0
for k, v in pairs(mytable) do
sum = sum + v
end
return "表所有元素的和为 " .. sum
end
})
print(mytable)
Plain Text
****变量作用域
- 全局变量
lua中没有显式声明的变量均为全局变量
- 局部变量
使用local修饰符的变量:
local a = 1
函数
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
function_body
return result_params_comma_separated
end
Plain Text
- ****optional_function_scope: 该参数是可选的指定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 ****local。
- ****argument1, argument2, argument3..., argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。
- ****result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
迭代器
垃圾回收
Lua 采用了自动内存管理。 这意味着你不用操心新创建的对象需要的内存如何分配出来, 也不用考虑在对象不再被使用后怎样释放它们所占用的内存。
同时, 还提供了API来手动进行垃圾回收:
--做一次完整的垃圾收集循环
collectgarbage("collect")
--以 K 字节数为单位返回 Lua 使用的总内存数
collectgarbage("count")
异常处理
- assert
assert函数是lua进行异常处理的一种方式. 使用方式如下:
--前者是条件判断, 后者是错误信息. 如果出错, 还会打印调用栈
assert(type(a)=="number","a 不是一个数字")
- error
error函数是lua进行异常处理的一种方式. 使用方式如下:
-- 该函数会终止正在执行的函数,并返回message的内容作为错误信息
-- Level=1[默认]:为调用error位置(文件+行号)
-- Level=2:指出哪个调用error的函数的函数
-- Level=0:不添加错误位置信息
error (message [, level])
Plain Text
模块
- 模块的定义
--文件名MyModule.lua
-- 定义当前模块名
MyModule = {}
-- 定义一个常量
MyModule.MY_VALUE = "这是一个常量"
-- 定义一个成员函数
function MyModule.func1()
io.write("这是一个公有函数!\n")
end
Plain Text
- 模块的导入
require("MyModule")
Plain Text
- 模块的搜索路径
require 用于搜索 Lua 文件的路径是存放在全局变量 package.path 中,当 Lua 启动后,会以环境变量 ****LUA_PATH 的值来初始这个环境变量
调用动态库
local path = "/usr/local/lua/lib/libluasocket.so"
-- 或者 path = "C:\windows\luasocket.dll",这是 Window 平台下
local f = assert(loadlib(path, "luaopen_socket"))
f() -- 真正打开库
Plain Text