Lua基础

全局变量

  • 在默认情况下,变量总是认为是全局的。
  • 全局变量不需要声明,给一个变量赋值后即创建了这个全局变量,访问一个没有初始化的全局变量也不会出错,但结果是nil。
  • 删除一个全局变量,赋值为nil

Lua数据类型

Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。

  • type函数():测试给定变量或者值的类型,类型为string

    nil

  • 对于全局变量和table,nil 还有一个”删除”作用
  • nil 作比较时应该加上双引号

boolean

  • false,nil -> false
  • 其他(包括) -> true

number

  • double类型,可以在luaconf.h中修改

string

  • 使用双引号、单引号表示单行字符串

    string1 = "this is string1"
    string2 = 'this is string1'
    
  • 使用[[]]来表示多行字符串

    string3 = [[
    123
    321
    ]]
    
  • .. 用于字符串连接

    print("a".."b")
    
  • 在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字

  • :计算字符串长度

table

  • table是一个关联数组,数组的索引可以是数字或者是字符串。
  • table的下标从1开始
a = { "1","2","3"}
print(a[1]) --1
b = { a = 1,b=1,c=1}
print(b[a])--nil
print(b["a"])--1
  • table 不会固定长度大小,有新数据添加时 table 长度会自动增长,没初始的 table 都是 nil。

function

  • 在 Lua 中,函数是被看作是”第一类值(First-Class Value)”
    • 函数可以存在变量里
    • 函数可以作为参数进行传递

thread

  • 在 Lua 里,最主要的线程是协同程序(coroutine),协程
    • 它跟线程(thread)差不多,拥有自己独立的栈、局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西
    • 线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起(suspend)时才会暂停。

userdata

  • userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用

Lua变量

  • Lua 变量有三种类型:全局变量、局部变量、表中的域。
  • Lua 变量默认初始化为nil

索引

t[i]
t.i -- 当索引为字符串类型时的一种简化写法
gettable_event(t,i)  -- 当索引为字符串类型时的一种简化写法

函数

optional_function_scope function function_name( argument1, argument2, argument3..., argumentn)
    function_body
    return result_params_comma_separated
end
  • optional_function_scope: 该参数是可选的制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。

  • function_name: 指定函数名称。

  • argument1, argument2, argument3…, argumentn: 函数参数,多个参数以逗号隔开,函数也可以不带参数。

  • function_body: 函数体,函数中需要执行的代码语句块。

  • result_params_comma_separated: 函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。


  • 函数可以作为参数
  • 可以有多个返回值
  • 可变参数
function Function_Name(...)
    local arg = {...}  -- arg 为一个表,局部变量
    select('#',...) -- 返回可变参数的长度
    select(n,...) --用于返回从起点 n 开始到结束位置的所有参数列表
    for i,v in ipairs(arg) do
        -- dosomething
    end
end

运算符

关系运算符

  • ~= 不等于

逻辑运算符

  • and or not

其他运算符

  • .. 连接连个字符串
  • # 返回字符串或者表的长度

字符串

  • 表示方法
    • 单引号间的一串字符
    • 双引号间的一串字符
    • [[ 与 ]] 间的一串字符

模块与包

  • require("<模块名>")