Lua 基础知识

发布时间: 更新时间: 总字数:1417 阅读时间:3m 作者: 分享 复制网址

Lua 基础知识

基础

  • 字符串连接,操作符 .. (两个点)
  • 函数 type() 能够返回一个值或一个变量所属的类型
  • assert() 判断
  • -- 开头表示单行注释
  • 多行注释
# 格式一
--[[
多
行注释
]]

# 格式二
--[==[
[[多行注释]]
]==]

基础数据类型

  • nil 表示 空对象或无效值

  • boolean 布尔值 true/false

    • Lua 中 nilfalse,其它所有值均为。比如 0空字符串就是
  • number 数字类型,和 C/C++ 里面的 double 类型很类似

    • math.floor 向下取整
    • math.ceil 向上取整
  • string 字符串是不可改变的值

    • 使用一对匹配的单引号,如:'hello'
    • 使用一对匹配的双引号,如:"world"
    • 使用一种 长括号(即[[ ]]) 括起来的方式定义,里面的 \n 不会被转义,如:[[abc\nxyz]],通常用来写正则表达式
    • 字符串使用 .. 链接,每次拼接会重新申请内存
    • # + str 可以计算字符串的长度,如 print(#'openresty') 输出 9
  • table 表类型,table 通常实现为一个哈希表、一个数组、或者两者的混合

  • function 函数类型

  • 示例

$ cat << EOF > test.lua
print(type(nil))
print(type(true))
print(type("helloworld"))
print(type(18))
print(type(18.8))
print(type(table))
print(type(print))
EOF

$ lua test.lua
nil
boolean
string
number
number
table
function

table

表(table) 是 Lua 唯一的数据类型,可以理解为 Python 中的数组、字典等

  • 使用 {} 定义,{} 表示空表
  • 使用 key=value 时,key 不需要单引号或双引号,若 key 是特殊字符,可以使用 [key]=value 形式
  • 使用 [] 操作表里的元素
  • key 是字符串,可使用 . 操作
  • # 可以计算 table 的长度
  • 使用 ipairs()/pairs() 函数遍历表
  • table 也可以作为函数的参数
  • 示例
local a = {1, 2, 3}
local b = {one=1, 2, [3]=3, ['a']={}}

print(a[1])  -- 1
b['two'] = 2
print(b['one'])
print(b.one)

a.xfunc = function(a)
    print(a)
end

-- 遍历 table
for i=1, #b do
    print(b[i], ', ')
end

for i,v in ipairs(b) do
    print(b[i], ', ')
end

for k,v in ipairs(b) do
    print(k, ' = ', v)
end

变量

  • 局部变量:使用 local 声明的变量,作用域当前代码块,推荐变量的声明方式
    • 局部变量 lua 解释器查询更快
  • 全局变量:没有使用 local 声明的变量
    • Lua 的全局变量保存在 _G 表里
local x = 1
local x, y = 1, 'ok'
local x, y = 1  -- 等价于 x = 1, y = nil
local x = nil   -- 删除变量

-- 语句块
do
    local y = 2
end

说明:

  • 若变量没有赋值,默认值为 nil
  • _ 表示占位符,同 Python 的使用,用来忽略变量
  • 常量通常用大写字母表示,使用 local 声明,如:local PI = 3.1415

算术运算符

  • + 加法
  • - 减法
  • * 乘法
  • / 除法
  • ^ 指数
  • % 取模

说明:

  • nil 进行运算操作会报错

关系运算符

  • < 小于
  • > 大于
  • <= 小于等于
  • >= 大于等于
  • == 等于,若类型不同,返回 false。可使用 tonumber()/tostring() 转化数字或字符串
  • ~= 不等于,若类型不同,返回 false

逻辑运算符

  • and 逻辑与,x and y 若 x 是真,返回 y,否则返回 x
  • or 逻辑或,x or y 若 x 是真,返回 x,否则返回 y
  • not 逻辑非

流程控制

条件 if-else

该部分语法和 shell 的 if 很相似

-- 基本结构
if conditions then
    ....
end

if conditions then
    ....
else
    ...
end

if conditions then
    ....
elseif conditions then
    ....
else
    ...
end

-- 单个 if 分支型
x = 10
if x > 0 then
    print("x is a positive number")

-- 两个分支 if-else 型
x = 10
if x > 0 then
    print("x is a positive number")
else
    print("x is a non-positive number")
end

-- 多个分支 if-elseif-else 型
score = 90
if score == 100 then
    print("Very good!")
elseif score >= 60 then
    print("Passed!")
    --此处可以添加多个elseif
else
    print("Sorry!")
end

while

# 定义
while 表达式 do
--body
end

# 示例
x = 1
sum = 0
while x <= 5 do
    sum = sum + x
    x = x + 1
end
print(sum)

for

-- 基本结构
for var=m,n,step do
    ....
end

-- 数字型 for(numeric for)
for var = begin, finish, step do
    --body
end

-- 范型 for(generic for)
local a = {"a", "b", "c", "d"}
for i, v in ipairs(a) do
  print("index:", i, " value:", v)
end

常见的迭代器:

  • 迭代文件中每行的(io.lines
  • 迭代 table 元素的(pairs
  • 迭代数组元素的(ipairs
  • 迭代字符串中单词的(string.gmatch

repeat

  • repeat,类似于 do-while
-- 基本结构
repeat
    ...
until conditions

-- 例如
x = 10
repeat
    print(x)
until false

其他控制

  • break 用来终止 whilerepeat-untilfor 三种循环的执行,并跳出当前循环体
  • return 用来从函数中返回结果,或用来简单的结束一个函数的执行
  • goto LuaJit 扩展的,可以变相实现 continue(Lua 语言没有 continue 的定义)
    • 使用 ::label:: 便签定义
    • 使用 goto label 跳转到对应的地方执行

优化

  • 全局变量查表效率低,使用 local 定义局部变量可以加速执行效率
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数