Lua语言总结


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 布尔值,nilfalse为假,true和非nil为真,因此,0为true
number 双精度浮点数,和double一样
string 字符串
function CLua编写的函数
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]]]) 列出从startend的所有元素,元素之间以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()

Author: Dovahkiin
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint policy. If reproduced, please indicate source Dovahkiin !
  TOC