Lua
在写这篇博客的时候,我满心都是月亮
基本介绍
Lua
是一种轻量小巧的脚本语言,使用标准C语言编写,支持面向过程和函数式编程,其和C不同,不需要程序员考虑内存的问题,语言自动管理内存.
其主要目的是嵌入程序中,为程序提供灵活扩展
编程方式
Lua
语言支持脚本式编程.
一般情况下,直接写代码,然后lua xxx.lua
运行.
但是,可以通过开头添加#!/usr/local/bin/lua
的方式,指定解释器位置,使用类似.bat
文件的方式运行.
Lua
同时也支持交互式编程,具体可见python.
注释方式
Lua
的注释方式很奇特.
单行注释:
--hello World
print("Hello World")
多行注释:
--[[
如果爱
请干净的爱
把爱情献给爱情
--]]
print("Hello World")
因为注释是--
,因此Lua
不支持自增自减运算
数据类型
数据类型 | 描述 |
---|---|
nil |
等同于NULL ,但是在Lua 中,这是一个数据类型, |
boolean |
布尔值,nil 和false 为假,true 和非nil 为真,因此,0为true |
number |
双精度浮点数,和double 一样 |
string |
字符串 |
function |
由C 或Lua 编写的函数 |
userdata |
任意存储在变量中的C 数据结构 |
thread |
线程 |
table |
是一个”关联数组” |
type
函数用于返回变量的数据类型,返回值是一个 string
number
默认是double
,但是可以通过修改源码里面luaconf.h
的定义
string
- 对于一块字符串可用
[[]]
表示,类似python中""""""
- 不支持
+
,使用+
会尝试转换成number
,而不是字符串拼接,字符串拼接是..
#
返回字符串长度
table
table
本质是一个字典(或者关联数组),在不给键值对的时候,默认value
是数字索引,特别注意,数字索引从1
开始,而不是从0
.
索引方式多样,比如:
t = {}
t[i]
t.i
gettable_event(t,i)
方法和用途:
方法 | 用途 |
---|---|
table.concat (table [, sep [, start [, end]]]) |
列出从start 到end 的所有元素,元素之间以sep 分割 |
table.insert (table, [pos,] value) |
插入元素,默认为尾部 |
table.remove (table [, pos]) | 删除指定位置的元素,默认为最后一个 |
table.sort() | 排序 |
function
因为function
变成了数据类型,因此,可以通过变量存储函数,类似函数指针.
同时,因为变成了变量,因此可以直接声明一个函数当成参数传给另一个函数.
函数的声明:
function fun()
--pass
end
函数支持多返回值
userdata
自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
变量声明
对于变量声明,local
表示局部变量,不加修饰就是全局变量,因此可以在函数里面声明一个全局变量.Lua
很神奇吧
循环和条件
循环
while(condition)
do
--statements
end
for var=exp1,exp2,exp3 do --var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,exp3默认为1,可以不写
--statements
end
for i,v in pairs(a) do --类似python for i in iterator
--statements
end
repeat --类似do while
--statements
until( condition )
Lua
的循环支持goto
语句,语法为goto lable
,lable
的定义为::lable::
条件
if (condition)
then
--statement
elseif (condition)
then
--statement
else
--statement
end
迭代器
Lua
支持自定义迭代函数,但是,笔者学习Lua
只是为了使用这个工具,不打算细究这个语言,因此,在这个模块,我只讨论ipairs()
和pairs()
的区别
ipairs()
ipairs
只支持数字索引,而且从1开始,相当于返回t[1],t[2],...,t[n]
,所以如果不是数字索引,或者不连续,那么得不到期望的结果.具体原因和其迭代器的实现有关,这里就不深究了.
pairs()
pairs
遍历所有的key
.
文件I/O
lua
的文件I/O
有些许复杂,分为简单模式和复杂模式,简单模式之下是通过改变程序标准输入输出来实现的,复杂模式则是通过句柄实现.
简单模式虽然是简单模式,但是实际应用还是由诸多不变,在此做简单介绍.
简单模式
-- 以只读方式打开文件
file = io.open("in.txt", "r")
-- 设置默认输入文件为in.txt
io.input(file)
-- 输出文件第一行
print(io.read())
-- 关闭打开的文件
io.close(file)
-- 以附加的方式打开只写文件
file = io.open("in.txt", "a")
-- 设置默认输出文件为in.txt
io.output(file)
-- 在文件最后一行添加
io.write("Hello World")
-- 关闭打开的文件
io.close(file)
对于io.read()方法,可以通过提供参数,获得不同的效果
参数 | 效果 |
---|---|
“*n” | 读取一个数字 |
“*a” | 从当前文字读取整个文件 |
“*l” | 默认参数,读取下一行 |
number | 返回一个指定字符的字符串,io.read(114514) ,返回114514个字符 |
完全模式
-- 以只读方式打开文件
file = io.open("in.txt", "r")
-- 输出文件第一行
print(file:read())
-- 关闭打开的文件
file:close()
-- 再次打开只写文件
file = io.open("in.txt", "a")
-- 在文件最后一行添加文字
file:write("Hello World")
-- 关闭打开的文件
file:close()