Lua版本、特性、数据结构和变量

Lua分支和版本

  • Lua有诸多版本和分支,其中最著名的当属以下三个:
  • Lua不存在官方创建的、给第三方库提供托管服务的网站(类比npm)。常用的第三方库的获取和安装主要有以下两种办法:
    • 从源码安装。这包括:
      • 纯Lua库,下载、解压到require加载路径下,导入即可;
      • C库,下载、配合Lua源码(lua.h等)进行编译(Linux下会生成.so文件),设置package.cpath,然后导入;
        • C库需要的Lua源码,Linux下可以通过apt-get install liblua5.4-dev来安装;
    • LuaRocks平台,可以当作第三方包管理器(Package Manager)使用
      • 建议Linux平台下载源码并编译安装:
1
2
3
4
sudo apt-get install liblua5.4-dev
./configure
make
sudo make install

语言特性

  • Lua是解释型语言;
    • 因此,Lua也是有opcode和bytecode的,运行在VM之上;
    • lua/lopcodes.h at master · lua/lua
    • luac和luajit也可以编译.lua,但执行仍需解释器(可以理解为类似.py.pyc的过程);
  • Lua解释器本体极小,且完全由C语言写成,因此可以很方便的:
    • 嵌入到其他大型程序中,如文本编辑器、游戏、开发工具等等;
    • 与高性能的C语言程序结合,拓展其功能,如nginx-lua-module;
    • 使用其编写功能完善的程序,并应用于嵌入式系统中,如openwrt的luci便是cgi+lua;
  • Lua语言是弱类型语言
  • Lua语言是面向过程的语言,但可以模拟面向对象
  • Lua的版本与版本之间差异较大
    • 运行于官版Lua上的库,可能无法兼容luajit或xLua;
    • 运行于Lua 5.1上的库,可能无法兼容Lua 5.2(不向后兼容);
    • 同样地,运行于Lua 5.2上的库,可能无法兼容Lua 5.1(不向前兼容);

基本结构

  • 由于不同的Lua分支可能在语法上有差异(甚至可能有不同的opcode),所以此处以官方版本语法为准

注释

  • 单行注释:--
1
-- Test
  • 多行注释:--[[ --]]
1
2
3
4
5
--[[
This
is
Comment
--]]

数据类型

  • Lua共有8个基本类型
  • nil:表示无效值/值不存在,可转换为布尔型的false
    • 未初始化的变量,访问即可得到其值nil
    • nil赋值给变量等同于将该变量删除,此后内存空间会被GC(垃圾回收器)自动回收
  • boolean:布尔型,值为true或者false
  • number:数字类型,保存一切数字数据,为双精度浮点型(即C中的double
  • string:字符串。双引号或单引号包裹字符串字面量。
  • function:函数,类似于C中的函数指针(只不过不需要各种间接访问符)。既可以是Lua中定义的函数,也可以是C插件中定义的函数。
  • thread:非抢占式协程(用户态线程),变量本身可看作是协程的handler。
    • Lua实现抢占式多线程(甚至是多进程)需要使用第三方库
    • 协程只能支持并发(时间段内同时)而不支持并行(时间点上同时)
    • Lua Lanes - multithreading in Lua
  • table:表,Lua中最重要的数据类型之一,兼具数组和Map的特征,同时可以用于模拟面向对象编程
  • userdata:纯内存空间。主要用于Lua环境与C插件间的变量交互,例如在Lua中给C插件生成的C语言结构体开辟空间
  • 判断变量的类型:type(xxx)

变量及其赋值

  • Lua变量赋值时均不用指定数据类型。以下是最简单的、合法的变量定义语句:
1
a = 10
  • 变量只有两种作用域类型:局部变量、全局变量。没有被local关键字修饰的变量均是全局变量
1
2
3
4
5
6
7
8
a = 10 --全局变量
local b = 20 --局部变量

function add()
c = 30 --全局变量,add函数以外仍可以访问
local d = 40 --局部变量,add函数结束就销毁
b = 50 --作用域外的全局变量或局部变量均可被重新赋值
end
  • 赋值语句:分为单值赋值语句和多值赋值语句
    • 单值赋值语句:与C语言几乎相同:task.m_1 = task.m_1 + 2
    • 多值赋值语句:可同时定义并初始化多个变量: a, b, c = 10, 2 + 2, 3.14
    • 多值赋值语句的特例:
      • 可以用于快速交换两个变量的值:x, y = y, x
      • 变量个数少于值的个数,多余的值会被忽略:a, b = 10, 11, 12,12会被忽略
      • 变量个数多于值的个数,多余的变量不会被定义

[[TODO]]

评论