【菜狗教程】Lua.01 - 基本语法和字符串处理

943 阅读3分钟

菜狗教程 —— Lua 篇 01

Hello World

官方网站:www.lua.org/start.html

安装完成后,使用lua或者lua -i进入交互式编程模式,或者使用lua <file_name>执行脚本文件。

lua_hello_world.png

变量

Lua 是动态类型语言,变量没有固定类型。变量默认是全局的,局部变量需要使用关键字local显式声明。

变量有8种类型:

  • nil
  • boolean
  • number
  • string
  • function
  • userdata
  • thread
  • table

可以使用 type() 函数输出任何变量的类型,输出的类型为 string,内容是上面8种之中的一个。

nil 表示没有任何值,也就是「空」。所有变量在未赋值之前都是 nil,将 nil 赋值给变量相当于删除。nil 可以用来判断是否相等(nil==nil = true),也可以将 nil 用作判断条件,此时相当于 false。

boolean 只有 true 和 false。Lua 中只有 nil 和 false 为假,其他都是真(包括数字 0)。

number 类型用于表示所有的数字,约等于 double。

string 可以用双引号或单引号表示,类似 python。也可以用[[]]包起来以不需转义的方式保留内部格式,相当于 Kotlin 的三引号。

string 类型可以直接进行数学运算,但如果内容无法转换成 number,就会报错。

string 拼接使用 .. 运算符,# 加 string 可以获得 string 的长度。更多 string 操作后面再单独说。

table 是 Lua 唯一的集合,使用 {} 创建。用法非常灵活,可以当成 Array 或者 Map 使用,也可以有更神奇的用法(比如模拟继承和多态等面向对象编程的能力)。

table 不指定 key 的时候相当于 Array,但是自动生成的 index 是从 1 开始的。指定 key 的时候相当于 Map。

table 索引可以用 [],将对应 index 或者 key 的 value 赋值成 nil 表示删除

function 在 Lua 中可以当做变量使用。其他关于 function 的内容单独展开写。

thread 在 Lua 中实际上是一种协程,详情后面展开。

userdata 表示一种自定义数据,通常来源于脚本外部(比如 C++ 的一个指针),可以按照一定方式使用。

lua_basic_type_1.png

运算符

Lua 的大部分运算符是常规的算数运算符,就有几个是需要特殊注意一下的:

运算符功能
~=不等于
#取 string 或 table 的长度
and逻辑与
or逻辑或
not逻辑非

流程控制

分支:

  • if - then - else - end

循环:

  • while - do - end
  • repeat - until
  • for i=exp1,exp2,exp3 - do - end
  • for k,v in pairs(table) - do - end

Lua 不使用花括号划定作用域,注意不要遗漏 then、do 和 end。

lua_basic_type_2.png

pairs 是一个内置函数,可以为 table 提供一个迭代器。

函数

function 也是变量,遵循默认全局,加 local 变局部的规则。

function 的范围从关键字 function 开始,到 end 结束,同样不需要花括号。

Lua 中 function 可以接收任意数量参数,返回任意数量的值。参数列表随函数一起定义,返回值则不需要在定义中声明。参数列表也可以使用 ... 表示可变长度。

字符串

string 的基本用法在变量中已经提到过,但字符串处理是比较常用的内容,这里补充一些 string 的内置函数。

Lua 提供了一些内置函数来处理 string:

函数名功能
string.upper(arg)变大写字母
string.lower(arg)变小写字母
string.gsub(inputStr, findStr, replaceStr, [replaceCount])找到并替换(指定次数)
string.find(inputStr, findStr, [init, [end]])找打并返回位置,两个返回值分别是 start end
string.reverse(arg)反转字符串
string.format(...)格式化输出(类似 printf)
string.char(args)ASCII 数字转字符串
string.byte(inputStr, [index])指定字符转 ASCII
string.len(arg)计算字符串长度
string.rep(arg)重复字符串

简单举几个例子,交互式编程模式也能记住之前定义的变量,很推荐初学者(指我自己)随便试试。

lua_basic_string.png

调试 Lua

Lua 中的注释使用 -- 标识,多行注释是结合 -- 和保留字符串格式的 [[]]

Lua 是用 print 函数输出日志,debug 库提供了一些能力以便更好的输出运行时信息。

彩蛋环节

image.png