LUA

42 阅读4分钟

注释

  1. 单行注释

--abc

  1. 多行注释

--[[

--]]

运算符

1.一般运算符

= - * / ......

  1. 其他运算符

..: 字符串连接运算符

#: 返回字符串/表的长度

变量的增删改查

  1. ****访问没有初始化的变量, 会返回nil
  1. ****删除一个变量, 只需要赋值nil
  1. ****初始化变量无需指定类型

lua定义变量时无需指定类型, 变量的类型在被赋予值时被确定.

type(valName): 输出类型名

****变量类型

  1. 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)。
  1. __index 元方法
-- 当通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。
> other = { foo = 3 }

> t = setmetatable({}, { __index = other })

> t.foo

3

> t.bar

nil

Plain Text

  1. __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

****变量作用域

  1. 全局变量

lua中没有显式声明的变量均为全局变量

  1. 局部变量

使用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")

异常处理

  1. assert

assert函数是lua进行异常处理的一种方式. 使用方式如下:

--前者是条件判断, 后者是错误信息. 如果出错, 还会打印调用栈

assert(type(a)=="number","a 不是一个数字")

  1. error

error函数是lua进行异常处理的一种方式. 使用方式如下:

-- 该函数会终止正在执行的函数,并返回message的内容作为错误信息
-- Level=1[默认]:为调用error位置(文件+行号)

-- Level=2:指出哪个调用error的函数的函数

-- Level=0:不添加错误位置信息
error (message [, level])

Plain Text

模块

  1. 模块的定义
--文件名MyModule.lua


-- 定义当前模块名
MyModule = {} 


-- 定义一个常量

MyModule.MY_VALUE = "这是一个常量"


-- 定义一个成员函数
function MyModule.func1()

    io.write("这是一个公有函数!\n")

end

Plain Text

  1. 模块的导入
require("MyModule")

Plain Text

  1. 模块的搜索路径

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