Lua迭代器
Lua 迭代器
迭代器是用于遍历集合或容器中元素的一种结构。在 Lua 语言中,集合往往指的是可以用来创建各种数据结构的表。比如,数组就是用表来创建的。
通用迭代器
通用迭代器可以访问集合中的键值对。下面是通用迭代器的一个简单例子:
array = {"Lua", "Tutorial"}
for key,value in ipairs(array)
do
print(key, value)
end
执行的上面的代码,我们可以得到如下的输出结果:
1 Lua
2 Tutorial
上面的例子中使用了 Lua 提供的默认迭代器函数 ipairs。
在 Lua 语言中,我们使用函数表示迭代器。根据是否在迭代器函数中是否维护状态信息,我们将迭代器分为以下两类:
无状态迭代器
有状态迭代器
无状态迭代器
由此迭代器的名称就可以看出来,这一类的迭代器函数中不会保存任何中间状态。
让我们一起来看一下下面这个例子。在这个例子中,我们用一个简单的函数创建了一个自己的迭代器。这个迭代器用以输出 n 个数的平方值。
function square(it ...
Lua中的for循环
Lua 中的 for 循环
for 循环控制结构可以让你高效地写出需要执行特定次数的循环代码。
语法
Lua 语言中 for 循环的语法如下:
for init,max/min value, increment
do
statement(s)
end
下面是 for 循环执行的流程:
init 首先执行并且只执行一次。在这一步骤中,你需要声明并初始化循环控制变量。
接下来,max/min 是循环结束的条件。程序中将 init 与 最大值或最小值进行比较,条件为真则继续执行循环,否则结束循环。
循环体执行后,程序跳转至递增或递减语句( increment/descrement )。此语句中,我们可以更新我们的控制变量。
再次检查条件。如果条件为真,则执行循环并重复过程(执行循环体,递增运算,再检查条件)。当条件为假时,结束循环。
流程图
示例
for i=10,1,-1
do
print(i)
end
执行上面的代码后,将得到如下的输出结果:
10
9
8
7
6
5
4
3
2
1
Lua元表
Lua 元表
正如其名,元表也是表。不过,将元表与表相关联后,我们就可以通过设置元表的键和相关方法来改变表的行为。元方法的功能十分强大,使用元方法可以实现很多的功能,比如:
修改表的操作符功能或为操作符添加新功能(译注:如果您学过 C++ 之类的面向对象的语言,应该比较好理解,其实它实现的是操作的重载)。
使用元表中的 __index 方法,我们可以实现在表中查找键不存在时转而在元表中查找键值的功能。
Lua 提供了两个十分重要的用来处理元表的方法,如下:
setmetatable(table,metatable):此方法用于为一个表设置元表。
getmetatable(table):此方法用于获取表的元表对象。
首先,让我们看一下如何将一个表设置为另一个表的元表。示例如下:
mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)
上面的代码可以简写成如下的一行代码:
mytable = setmetatable({},{ ...
Lua表
Lua 表
在 Lua 语言中,表是唯一可以用来创建不同数据类型的数据结构,比如常见的数组和字典都是用表来创建的。 Lua 语言中经常到关联数组这种数据类型,它不仅可以用数值作为索引值,除了 nil 以外的字符串同样可以作为其索引。表没有固定的大小,当数据量增加时表会自动增大。
Lua 语言中的各种结构表示都用到了表,包括包(package)的表示。当我们使用方法 string.format 时,我们用到的其实是包 string 中的方法 format。
使用表
表被称之为对象,它既不是值也不是变量。Lua 用构造表达式 {} 创建一个空表。需要注意的是,在存储表的变量和表本身之间没有什么固定的对应关系(译注:一个表可以被不同的变量引用,一个变量也可以随时改变其所引用的表对象)。
--简单的表初始化
mytable = {}
--简单的表赋值
mytable[1]= "Lua"
--移除引用
mytable = nil
-- lua 的垃圾回收机制负责回收内存空间
当我们有一个拥有一系列元素的表时,如果我们将其赋值给 b。那么 a 和 b 都会引用同一个表对 ...
Table复制
Table复制
构造一个lua table变量,然后对这个变量在调用函数进行制和专递。
可以使用以下代码构造一个Lua table变量,并调用函数进行传递:
-- 构造一个Lua table变量
local myTable = {
name = "John",
age = 25,
occupation = "Engineer"
}
-- 定义一个函数,接受一个table参数并打印其内容
function printTable(table)
print("Name:", table.name)
print("Age:", table.age)
print("Occupation:", table.occupation)
end
-- 调用函数并传递myTable作为参数
printTable(myTable)
运行以上代码,输出结果如下:
Name: John
Age: 25
Occupation: Engineer
创建声明一个大的Lua的table型变量的数组
可以使用以下方法创建一个大的Lua table型变 ...
Lua基本语法
基本语法
Lua 学起来非常简单。现在,让我们开始创建我们的第一个 Lua 程序吧!
第一个 Lua 程序
Lua 提供交互式编程模式。在这个模式下,你可以一条一条地输入命令,然后立即就可以得到结果。你可以在 shell 中使用 lua -i 或者 lua 命令启动。输入命令后,按下回车键,就启动了交互模式,显示如下:
$ lua -i
$ Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
quit to end; cd, dir and edit also available
你可以使用如下命令打印输出:
$> print("test")
按下回车键后,你会得到如下输出结果:
'test'
默认模式编辑
使用 Lua 文件做为解释器的参数启动解释器,然后开始执行文件直到文件结束。当脚本执行结束后,解释器就不在活跃了。
让我们写一个简单的 Lua 程序。所有的 Lua 文件都扩展名都是.lua。因此,将下面的源代码放到 test.lua 文件中。
print("test")
假如你已经设置好 Lua 程序的环境,用下面的命令 ...
Lua错误处理
Lua 错误处理
为什么需要错误处理机制
在真实的系统中程序往往非常复杂,它们经常涉及到文件操作、数据库事务操作或网络服务调用等,这个时候错误处理就显得非常重要。不关注错误处理可能在处理诸如涉密或金融交易这些业务时造成重大的损失。
无论什么时候,程序开发都要求小心地做好错误处理工作。在 Lua 中错误可以被分为两类:
语法错误
运行时错误
语法错误
语法错误是由于不正确的使用各种程序语法造成的,比如错误的使用操作符或表达式。下面即是一个语法错误的例子:
a == 2
正如你知道的那样,单个等号与双等号是完全不一样的。二者之间随意的替换就导致语法错误。一个等号表示的是赋值,而双等号表示比较。类似地,下面这一小段代码中也存在语法错误:
for a= 1,10
print(a)
end
执行上面的这段程序,我们会得到如下的输出结果:
lua: test2.lua:2: 'do' expected near 'print'
语法错误相比于运行时错误更容易处理,因为 Lua 解释器可以更精确的定位到语法错误的位置。由上面的错误,我们可以容易就知道,在 print 语句前添加 ...
Lua中的 if...else 语句
Lua 中的 if…else 语句
如果 if 语句后面跟上 else 语句,那么条件为假时就执行 else 语句的代码。
语法
Lua 语言中 if…else 语句的语法如下所示:
if(boolean_expression)
then
--[ 如何条件为真,则执行此处代码。 --]
else
--[ 如何条件为假,则执行此处代码。 --]
end
当布尔表达式为真时,执行 if 语句的代码块;如果条件为假时,则执行 else 语句的代码块。
Lua 语言中所有布尔真与非 nil 的组合的结果被当作真,而布尔假与 nil 组合被当作假。值得注意的是,Lua 中零被当作真,这一点与其它大部分语言不一样。
流程图
示例
--[ 定义局部变量 --]
a = 100;
--[ 检查条件 --]
if( a < 20 )
then
--[ 如果条件为真,则输出如下内容 --]
print("a is less than 20" )
else
--[ 如果条件为假,则输出如下内容 --]
print("a is not less than 2 ...
Lua操作系统工具库
Lua 操作系统工具库
在很多应用中,我们都需要访问到操作系统级别的函数,操作系统库就给我们提供了这样的工具。下面的列表给出操作系统工具包提供的方法:
S.N.
函数与功能
1
os.clock():以秒为单位返回程序运行所用 CPU 时间的近似值。
2
os.date([format[,time]]):返回时间字符串或包含时间的表,时间按指定格式格式化。
3
os.difftime(t2,t1):返回从 t1 时刻至 t2 时刻经历的时间。在 POSIX,windows,及其它某些系统中,该值就是 t2-t1。
4
os.execute([command]):该函数等价于 ANSI C 中的 system 函数。传递的参数 command 由操作系统的 shell 执行。如果命令成功结束,则返回的第一个值为 true,否则为 nil。
5
os.exit([code[,close]]):调用 ANSI C 的 exit 函数,结束程序。如果 code 为 true, 则返回状态为 EXIT ...
Lua数据库访问
Lua 数据库访问
简单的数据操作,我们用文件就可以处理。但是,某些时候文件操作存在性能、扩展性等问题。这时候,我们就需要使用数据库。LuaSQL 是一个提供数据库操作的库,它支持多种 SQL 数据库的操作。包括:
SQLite
MySQL
ODBC
在本教程中,我们会讲解用 Lua 语言对 MySQL 数据库与 SQLite 数据库进行操作。这些操作具有一般性,它们也可以移植到其它类型 SQL 数据库中。首先让我们看一下如何操作 MySQL 数据库。
MySQL 数据库环境设置
为了下面的例子可以正确演示,我们需要首先初始化数据库设置。我们假设你已经完成了如下的工作:
安装 MySQL 数据库,使用默认用户名 root, 默认密码为: 123456。
已经创建数据库 test。
已经阅读过关于 MySQL 的基本教程,并掌握了 MySQL 的基本知识。
导入 MySQL
假设你已经安装配置正确了,那么我们可以使用 require 语句导入 sqlite 库。安装过程中会产生一个存储数据相关文件的目录 libsql。
mysql = require ...


