Lua


1.3 Lua基本语法


文档摘要

1.3 Lua基本语法 Lua入门:基本语法详解与实践 本文将深入浅出地介绍Lua的基本语法,并通过丰富的代码实践,帮助你快速掌握Lua编程的基础知识,为后续深入学习和应用Lua打下坚实的基础。 目录 Lua 语言简介与环境搭建 (简略,非重点) Lua 变量与数据类型 Lua 运算符 Lua 控制结构 Lua 函数 Lua 注释 Lua 简单输入输出 1. Lua 语言简介与环境搭建 (简略,非重点) Lua 是一种由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)的 Roberto Ierusalimschy、Luiz Henrique de Figueiredo 和 Waldemar Celes 等人于

1.3 Lua基本语法

Lua入门:基本语法详解与实践

本文将深入浅出地介绍Lua的基本语法,并通过丰富的代码实践,帮助你快速掌握Lua编程的基础知识,为后续深入学习和应用Lua打下坚实的基础。

目录

  1. Lua 语言简介与环境搭建 (简略,非重点)

  2. Lua 变量与数据类型

  3. Lua 运算符

  4. Lua 控制结构

  5. Lua 函数

  6. Lua 注释

  7. Lua 简单输入输出

1. Lua 语言简介与环境搭建 (简略,非重点)

Lua 是一种由巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)的 Roberto Ierusalimschy、Luiz Henrique de Figueiredo 和 Waldemar Celes 等人于 1993 年开发的脚本语言。它的名字 "Lua" 在葡萄牙语中意为 "月亮"。

Lua 的特点:

  • 轻量级: Lua 解释器体积小巧,资源占用少,非常适合嵌入式环境。

  • 高效: Lua 运行速度快,性能优秀。

  • 可嵌入: Lua 可以很容易地嵌入到宿主程序(如 C/C++ 程序)中,作为扩展或配置语言。

  • 简洁的语法: Lua 语法清晰简洁,易于学习和使用。

  • 动态类型: Lua 是动态类型语言,无需显式声明变量类型,类型检查在运行时进行。

  • 可扩展: Lua 提供了丰富的扩展机制,可以通过 C/C++ 扩展库来增强功能。

环境搭建 (简要说明):

你可以从 Lua 官网 www.lua.org 下载 Lua 解释器。安装过程通常很简单,根据你的操作系统选择合适的版本进行安装即可。安装完成后,你就可以在命令行中使用 lua 命令来运行 Lua 脚本了。

对于初学者,推荐使用一些在线 Lua 解释器或者集成开发环境 (IDE),例如:

本文将侧重于 Lua 语法讲解,环境搭建部分不再赘述。

2. Lua 变量与数据类型

在 Lua 中,变量用于存储数据。Lua 是一种动态类型语言,这意味着你不需要显式声明变量的类型。变量的类型会根据赋给它的值自动确定。

2.1 变量命名规则

  • 变量名可以由字母、数字和下划线组成。

  • 变量名必须以字母或下划线开头。

  • 变量名区分大小写 (例如 myVarmyvar 是不同的变量)。

  • 避免使用 Lua 预定义的关键字作为变量名 (例如 if, then, function 等)。

2.2 变量赋值

使用等号 = 进行变量赋值。

-- 变量赋值示例 message = "Hello, Lua!" -- 字符串类型 count = 10 -- 数字类型 (整数) price = 99.99 -- 数字类型 (浮点数) is_valid = true -- 布尔类型

代码实践 1: 变量赋值与打印

-- 定义变量并赋值 name = "Alice" age = 30 height = 1.65 -- 打印变量的值 print("Name:", name) print("Age:", age) print("Height:", height)

代码详解 1:

  • name = "Alice", age = 30, height = 1.65: 分别将字符串 "Alice",整数 30 和浮点数 1.65 赋值给变量 name, age, height

  • print("Name:", name): 使用 print() 函数输出内容。print() 函数可以接受多个参数,用逗号 , 分隔。它会将参数依次输出到控制台。这里分别输出了字符串 "Name:" 和变量 name 的值。

2.3 Lua 数据类型

Lua 中有以下几种基本数据类型:

  • nil: 空值类型。表示变量没有被赋值,或者显式地赋予 nil 值。

  • boolean: 布尔类型。只有两个值:true (真) 和 false (假)。

  • number: 数字类型。用于表示数值,可以是整数或浮点数。Lua 5.3 版本之后区分了 integer (整型) 和 float (浮点型),但通常情况下可以不必过多关注,Lua 会自动处理。

  • string: 字符串类型。用于表示文本,可以使用单引号 ' 或双引号 " 括起来。

  • table: 表类型。Lua 中唯一的数据结构机制,功能强大,可以用来表示数组、字典、对象等。

  • function: 函数类型。Lua 中函数也是一种数据类型,可以赋值给变量,作为参数传递,也可以作为返回值。

  • userdata: 用户数据类型。用于表示宿主程序 (如 C/C++) 创建的自定义数据类型。

  • thread: 线程类型。用于表示独立的执行线程 (协程)。

2.3.1 nil 类型

nil 类型表示空值或无效值。当一个变量没有被赋值时,它的默认值就是 nil

-- nil 类型示例 my_variable = nil -- 显式赋值为 nil another_variable -- 未赋值,默认为 nil print(my_variable) --> 输出: nil print(another_variable) --> 输出: nil print(type(my_variable)) --> 输出: nil

2.3.2 boolean 类型

boolean 类型只有两个值:truefalse,用于表示真假。Lua 中,falsenil 被认为是假,其他所有值 (包括数字 0 和空字符串 "") 都被认为是真。

-- boolean 类型示例 is_ready = true is_finished = false print(is_ready) --> 输出: true print(is_finished) --> 输出: false print(type(is_ready)) --> 输出: boolean if is_ready then print("程序准备就绪!") end if not is_finished then print("程序仍在运行...") end

2.3.3 number 类型

number 类型用于表示数值,可以是整数或浮点数。

-- number 类型示例 integer_num = 10 float_num = 3.14 negative_num = -5 scientific_notation = 2.5e3 -- 科学计数法 (2500) print(integer_num) --> 输出: 10 print(float_num) --> 输出: 3.14 print(negative_num) --> 输出: -5 print(scientific_notation) --> 输出: 2500 print(type(integer_num)) --> 输出: number

2.3.4 string 类型

string 类型用于表示文本,可以使用单引号 ' 或双引号 " 括起来。

-- string 类型示例 str1 = "Hello, Lua" -- 双引号字符串 str2 = 'World!' -- 单引号字符串 str3 = [[多行字符串 可以包含换行符和特殊字符。]] -- 长字符串,使用 [[ ]] print(str1) --> 输出: Hello, Lua print(str2) --> 输出: World! print(str3) --> 输出: -- 多行字符串 -- 可以包含换行符和特殊字符。 print(type(str1)) --> 输出: string

字符串连接: 使用 .. 运算符连接字符串。

-- 字符串连接 greeting = "Hello" .. ", " .. "Lua!" print(greeting) --> 输出: Hello, Lua!

2.3.5 table 类型

table 是 Lua 中最重要也是最强大的数据类型。它是一种关联数组,可以存储各种类型的值,并使用任意类型的值作为键 (key),但 nil 除外。Table 可以用来实现数组、字典、对象等复杂的数据结构。

-- table 类型示例 -- 创建一个空 table my_table = {} -- 使用数字索引 (类似数组) my_table[1] = "Lua" my_table[2] = "Table" my_table[3] = 100 -- 使用字符串索引 (类似字典/哈希表) my_table["name"] = "Table Example" my_table["version"] = 1.0 print(my_table[1]) --> 输出: Lua print(my_table["name"]) --> 输出: Table Example print(my_table.version) --> 输出: 1.0 (语法糖,等价于 my_table["version"]) print(type(my_table)) --> 输出: table

代码实践 2: 使用 table 存储学生信息

-- 创建一个 table 存储学生信息 student = {} student.name = "Bob" student.age = 20 student.major = "Computer Science" student[1] = "Excellent" -- 使用数字索引添加评价 -- 打印学生信息 print("Name:", student.name) print("Age:", student.age) print("Major:", student.major) print("评价:", student[1])

代码详解 2:

  • student = {}: 创建一个空的 table,命名为 student

  • student.name = "Bob" 等: 使用点号 . 语法为 table 添加键值对。student.name 等价于 student["name"]

  • student[1] = "Excellent": 使用数字索引添加键值对。

  • print(...): 打印 table 中存储的学生信息。

2.3.6 function 类型

在 Lua 中,函数也是一种数据类型,可以像其他类型的值一样赋值给变量。

-- function 类型示例 -- 定义一个函数 function greet(name) print("Hello, " .. name .. "!") end -- 将函数赋值给变量 my_function = greet -- 调用函数 greet("Lua User") --> 输出: Hello, Lua User! my_function("Beginner") --> 输出: Hello, Beginner! print(type(greet)) --> 输出: function

2.3.7 userdata 和 thread 类型

userdatathread 类型在入门阶段使用较少,这里简单介绍一下:

  • userdata: 用于表示宿主程序 (如 C/C++) 创建的自定义数据,Lua 代码可以通过 userdata 类型与宿主程序进行交互。

  • thread: Lua 支持协程 (coroutine),thread 类型用于表示协程,可以实现轻量级的并发编程。

3. Lua 运算符

Lua 提供了丰富的运算符,用于进行各种运算操作。

3.1 算术运算符

运算符 描述 示例
+ 加法 a + b
- 减法 a - b
* 乘法 a * b
/ 除法 a / b
% 取模 (求余) a % b
^ 幂运算 a ^ b
- (一元) 负号 -a

代码实践 3: 算术运算符

-- 算术运算符示例 a = 10 b = 3 print("a + b =", a + b) --> 输出: a + b = 13 print("a - b =", a - b) --> 输出: a - b = 7 print("a * b =", a * b) --> 输出: a * b = 30 print("a / b =", a / b) --> 输出: a / b = 3.3333333333333 print("a % b =", a % b) --> 输出: a % b = 1 print("a ^ b =", a ^ b) --> 输出: a ^ b = 1000 print("-a =", -a) --> 输出: -a = -10

3.2 关系运算符

运算符 描述 示例 返回值
== 等于 a == b truefalse
~= 不等于 a ~= b truefalse
> 大于 a > b truefalse
< 小于 a < b truefalse
>= 大于等于 a >= b truefalse
<= 小于等于 a <= b truefalse

代码实践 4: 关系运算符

-- 关系运算符示例 x = 5 y = 10 print("x == y:", x == y) --> 输出: x == y: false print("x ~= y:", x ~= y) --> 输出: x ~= y: true print("x > y:", x > y) --> 输出: x > y: false print("x < y:", x < y) --> 输出: x < y: true print("x >= y:", x >= y) --> 输出: x >= y: false print("x <= y:", x <= y) --> 输出: x <= y: true

3.3 逻辑运算符

运算符 描述 示例
and 逻辑与 a and b
or 逻辑或 a or b
not 逻辑非 not a

逻辑运算符的特点:

  • and: 如果第一个操作数为假 (false 或 nil),则返回第一个操作数,否则返回第二个操作数。

  • or: 如果第一个操作数为真 (非 false 且非 nil),则返回第一个操作数,否则返回第二个操作数。

  • not: 如果操作数为假 (false 或 nil),则返回 true,否则返回 false

代码实践 5: 逻辑运算符

-- 逻辑运算符示例 p = true q = false r = nil print("p and q:", p and q) --> 输出: p and q: false print("p or q:", p or q) --> 输出: p or q: true print("not p:", not p) --> 输出: not p: false print("q and r:", q and r) --> 输出: q and r: false print("q or r:", q or r) --> 输出: q or r: nil print("not r:", not r) --> 输出: not r: true

3.4 连接运算符

.. 运算符用于连接两个字符串。

代码实践 6: 连接运算符

-- 连接运算符示例 str_part1 = "Lua is " str_part2 = "powerful!" full_string = str_part1 .. str_part2 print(full_string) --> 输出: Lua is powerful!

3.5 长度运算符

# 运算符用于获取字符串或 table 的长度。

  • 对于字符串,# 返回字符串的字节数 (对于 ASCII 字符串,字节数等于字符数)。

  • 对于 table,# 的行为在 Lua 5.1 和 Lua 5.2+ 版本有所不同。在 Lua 5.1 中,# 可能无法准确获取稀疏数组的长度。在 Lua 5.2+ 版本中,# 会返回 table 的 "边界" (boundary),即从 1 开始的连续整数索引的最大值。

代码实践 7: 长度运算符

-- 长度运算符示例 str = "Hello, Lua!" tbl = {10, 20, 30, nil, 40} print("#str:", #str) --> 输出: #str: 12 print("#tbl:", #tbl) --> 输出: #tbl: 3 (Lua 5.1 可能输出 3 或 5,Lua 5.2+ 输出 3) tbl2 = { [1] = 1, [2] = 2, [10] = 10 } print("#tbl2:", #tbl2) --> 输出: #tbl2: 2 (Lua 5.2+ 输出 2)

4. Lua 控制结构

Lua 提供了多种控制结构,用于控制程序的执行流程,包括条件语句和循环语句。

4.1 条件语句: if-then-elseif-else-end

if 语句用于根据条件执行不同的代码块。

-- if 语句语法 if condition then -- 条件为真时执行的代码块 elseif condition2 then -- 可选的 elseif 分支,可以有多个 -- 条件2 为真时执行的代码块 else -- 可选的 else 分支 -- 所有条件都不为真时执行的代码块 end

代码实践 8: if-then-elseif-else-end 语句

-- if-then-elseif-else-end 示例 score = 85 if score >= 90 then grade = "A" elseif score >= 80 then grade = "B" elseif score >= 70 then grade = "C" elseif score >= 60 then grade = "D" else grade = "F" end print("Score:", score, "Grade:", grade) --> 输出: Score: 85 Grade: B

4.2 循环语句

Lua 提供了以下几种循环语句:

  • while 循环: 当条件为真时,重复执行循环体。

  • for 循环 (数值型): 用于按照指定步长遍历数值范围。

  • for 循环 (泛型): 用于遍历迭代器 (例如 table 的键值对)。

  • repeat-until 循环: 先执行循环体,然后判断条件,如果条件为假,则继续循环。

4.2.1 while 循环

-- while 循环语法 while condition do -- 循环体,条件为真时重复执行 end

代码实践 9: while 循环

-- while 循环示例 count = 1 while count <= 5 do print("Count:", count) count = count + 1 -- 递增计数器 end

4.2.2 for 循环 (数值型)

-- 数值型 for 循环语法 for variable = start, finish, step do -- step 可选,默认为 1 -- 循环体,variable 从 start 递增到 finish,每次步长为 step end

代码实践 10: for 循环 (数值型)

-- 数值型 for 循环示例 -- 从 1 循环到 5 for i = 1, 5 do print("i:", i) end -- 从 1 循环到 10,步长为 2 for j = 1, 10, 2 do print("j:", j) end

4.2.3 for 循环 (泛型)

泛型 for 循环通常与迭代器函数一起使用,用于遍历 table 或其他可迭代的数据结构。Lua 提供了 pairs()ipairs() 迭代器函数用于遍历 table。

  • pairs(table): 迭代 table 的所有键值对,键的顺序不确定。

  • ipairs(table): 迭代 table 的数字索引键值对,键的顺序是数字索引的升序,遇到非数字索引或 nil 值则停止迭代。

-- 泛型 for 循环语法 for key, value in iterator_function(collection) do -- 循环体,key 和 value 分别为迭代器返回的键和值 end

代码实践 11: for 循环 (泛型) 遍历 table

-- 泛型 for 循环遍历 table 示例 student_info = { name = "Tom", age = 22, major = "Physics", [1] = "Good student" } print("使用 pairs() 遍历 table:") for key, value in pairs(student_info) do print("Key:", key, "Value:", value) end print("\n使用 ipairs() 遍历 table:") for index, value in ipairs(student_info) do print("Index:", index, "Value:", value) end

代码详解 11:

  • pairs(student_info): 返回一个迭代器,用于遍历 student_info table 的所有键值对。for 循环每次迭代会从迭代器中获取一个键值对,分别赋值给 keyvalue

  • ipairs(student_info): 返回一个迭代器,用于遍历 student_info table 的数字索引键值对。for 循环每次迭代会从迭代器中获取一个索引和值,分别赋值给 indexvalue。注意 ipairs 只遍历数字索引,并且遇到非数字索引或 nil 值会停止迭代。

4.2.4 repeat-until 循环

-- repeat-until 循环语法 repeat -- 循环体,至少执行一次 until condition -- 条件为真时结束循环

代码实践 12: repeat-until 循环

-- repeat-until 循环示例 local num = 0 repeat num = num + 1 print("Number:", num) until num >= 3 -- 当 num 大于等于 3 时结束循环

5. Lua 函数

函数是组织代码的基本单元,用于封装可重用的代码块。在 Lua 中,函数是第一类值 (first-class values),可以赋值给变量,作为参数传递,也可以作为返回值。


发布者: 作者: 转发
评论区 (0)
U