Lua教程

1 Lua简介

参考文章

Lua1.x
对于学术用途是免费的,但是商业用途则需要协商
Lua2.x
table作为对象和类的基础,table索引,算术操作符,字符串拼接,顺序比较,函数调用, Lua作为无限制免费软件发布,
Lua3.x
我们解决了fallback冲突问题。我们将fallback替换为tag方法:钩子是以(event, tag)的形式挂在字典里的。

  • Lua应用场景:游戏开发,独立应用脚本,扩展和数据库插件,安全系统

2 Lua编程工具

Lua在线编程

Lua在线编程
第一个Lua程序
Lua开发工具LuaEdit下载
lua开发工具安装教程
在这里插入图片描述

3 起点

3.1 编程方法

lua [options] [script [args]]

-e:直接将命令传入Lua

prompt> lua -e "print(math.sin(12))" --> -0.53657291800043

-l:加载一个文件.

-i:进入交互模式.

_PROMPT内置变量作为交互模式的提示符

prompt> lua -i -e "_PROMPT=' lua> '"`

lua>

      Lua的运行过程,在运行参数之前,Lua会查找环境变量LUA_INIT的值,如果变量存在并且值为@filename,Lua将加载指定文件。如果变量存在但不是以@开头,Lua假定filename为Lua代码文件并且运行他。利用这个特性,我们可以通过配置,灵活的设置交互模式的环境。可以加载包,修改提示符和路径,定义自己的函数,修改或者重命名函数等。

全局变量arg存放Lua的命令行参数。

prompt> lua script a b c

在运行以前,Lua使用所有参数构造arg表。脚本名索引为0,脚本的参数从1开始增加。脚本前面的参数从-1开始减少。

prompt> lua -e "sin=math.sin" script a b

arg表如下:

arg[-3] = “lua”

arg[-2] = “-e”

arg[-1] = “sin=math.sin”

arg[0] = “script”

arg[1] = “a”

arg[2] = “b”
交互式编程,在控制台交互界面直接输入lua代码运行:
交互式编程
脚本式编程,通过调用lua文件,使lua文件中的代码直接运行:
在这里插入图片描述
开发工具编程,在Lua开发工具里进行编译,开发工具里可以对代码进行调试,方便上手:
在这里插入图片描述

3.2注释

单行注释

-- 单行注释

多行注释

--[[
 多行注释
 多行注释
 ]]--

3.3关键字(21个)

and break do else
elseif end false for
function if in local
nil not or repeat
return then true until
while

3.4 标识符

注:lua是大小写敏感的,比如a和A是两个不同的标识符
标识符:用于定义一个变量,函数获取其他用户定义的项目,以字母(a-z或A-Z)或者 下划线_ 开头的字母、下划线、数字序列。

4 数据类型和值

Lua是动态类型语言,变量不要类型定义。变量没有预定义的类型,每一个变量都可能包含人一种类型的值。Lua中有8个基本类型分别是nil,boolean,number,string,userdata,function,thread和table,函数type可以测试指定变量或者值的类型。
在这里插入图片描述
在这里插入图片描述
一般情况下同一变量代表不同类型的值会造成混乱,最好不要用,但是特殊情况下可以带来便利,比如nil

4.1 nil

一个取值nil;一个全局变量没有被赋值前为nil,给全局变量赋nil可以删除该变量

4.2 boolean

两个取值false和true。在控制结构中除了false和nil为假,其他的值都为真。比如0和空串都是真

4.3 number

表示实数,Lua中没有整数。数据常量的小数部分和指数部分都是可选的,数据常量的例子:

4		0.4		4.57e-3		0.3e12		5e+12

4.4 string

    字符的序列,lua是8位字节,所以字符串可以包含任何数值字符,包括嵌入的0。意味着你可以存储任意的二进制数据在一个字符串里。Lua中字符串是不可以修改的,你可以创建一个新的变量存放你要的字符串,如下:


    string和其他对象一样,Lua自动进行内存分配和释放,一个string可以只包含一个字母也可以包含一本书,Lua可以高效地处理长字符串,1M的string在Lua中很是常见的。可以使用单引号或者双引号表示字符串,也可以使用[[]]间的字符表示字符串,最好使用一种,除非两种引号嵌套情况,

a = "a line"
b = 'another line'

可以通过#来计算字符串的长度,放在字符串前面

  • 转义字符
\a 响铃(BEL)
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表tab
\v 垂直指标
\\ 反斜线字符\
\" 双引号字符
\' 单引号字符
\ddd 13位八进制数所代表的任意字符
\xhh  12位十六进制所代表的任意字符

4.5 table

table的创建是通过构造表达式来完成,最简单的构造表达式是{},用来创建一个空表。

local tb1 = {}
local tb2 = {
  
  "yu","an","rui"}

table其实是一个关联数组,数组的索引可以是数字也可以是字符串(相当于map)

a = {}
a["key1" ]= "v1"
a[1] = 22;
a[1] = a[1]+11;
for k,v in pairs(a) do
	print(k,":",v)
end
-- key1:v1
-- 1:33

Lua里表的默认初始索引一般以1开始

local tb2 = {
  
  "yu","an","rui"}
for k,v in pairs(tb2) do
	print(k,v)
end
--1yu
--2an
--3rui

4.6 function

函数可以存在变量里

function say(n)
	print(n)
end
say2 = say
say2(10)

函数可以以你们函数的方式作为参数传递

function test(t1,fun)
	for k,v in pairs(t1) do
		print(fun(k,v))
	end
end
tab = {
  
  "a","b"}
test(tab,
function(key,val)
	return key .. " = ".. val
end
);

4.7 thread

线程和协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个

  • lua里,最主要的线程是协同程序。和线程差不多,拥有自己独立的栈,局部变量和指令指针,可以跟其他协同程序共享全局变量和其他大部分东西。

4.8 userdata

userdata是一种用户自定义数据,用于表示一种由应用程序或c/c++语言库所创建胡类型,可以将任意c/c++的任意数据类型的数据(通常是struct和指针)存储到Lua变量中调用。

5 变量

变量有三种里类型:全局变量,局部变量,表中的域
        默认情况下,变量总是认为是全局的,全局变量不需要声明,给一个变量赋值后即创建了全局变量,访问一个没有初始化的全局变量也不会出错,只不过得到的结果是nil。如果你想删除一个全局变量,只需要讲变量赋值为nil。
      用local显式声明为局部变量,局部变量的作用域为从声明位置开始到所在语句块结束。变量的默认值为nil。访问局部变量胡速度比全局变量更快

6 表达式(运算符)

  • 算术运算符:+ - * / ^ %
  • 关系运算符:< > <= >= == ~=
  • 逻辑运算符:and or not
  • 连接运算符: ..

字符串连接,如果操作数为数字,Lua将数字转成字符串。

print("Hello " .. "World")      --> Hello World
print(0 .. 1)                   --> 01
  • 其他运算符:#

返回字符串或表的长度

print(#"Hello") --->5
  • 运算符优先级

从高到低。

^

not    - (unary)

*      /

+      -

..

<      >      <=     >=     ~=     ==

and

or

其中除了^和…外所有的二元运算符都是左连接的
x^y^z <--> x^(y^z)

7 基本语法

7.1 赋值语句

  • 赋值改变一个变量的值和改变表域的最基本方法
a = "hello" .. "world"
t.n = t.n+1
  • 多个变量同时赋值
a,b = 10,2*x   <-->       a=10; b=2*x

遇到赋值语句Lua先计算右边所有的值然后再执行赋值操作,这样我们就可以进行交换变量胡值

  • 多变量赋值,数和值的个数不一致
    值个数不足够,补nil;变量个数不足,多余的值会被忽略
  • 多值赋值经常用来交换变量,或将函数调用返回给变量
a, b = f() --f()返回两个值,第一个赋给a,第二个赋给b。

7.2 控制结构语句

控制结构的条件表达式结果可以是任何值,Lua认为false和nil为假,其他值为真

  • if语句-三种形式
if conditions then
	then_part
end
if conditions then
	then_part
else
	else_part
end
if conditions then
	then_part
elseif conditions then
	elseif_part
.. -->多个elseif
else
	else_part
end
  • while语句
while conditon do
	statements;
end
  • repeat-untile语句
repeat
	statements;
until conditons;
  • for-两大类语句

第一 ,数值for循环

for var = exp1,exp2,exp3 do
	loop-part
end

    for将用exp3作为stept从exp1到exp2,执行loop-part.其中exp3可以省略,默认step=1
有几点需要注意:三个表达式只会在循环前计算一次;控制变量var是局部变量自动被声明,并且只能在循环内有效;循环过程中最好不要改变控制变量的值。
第二,范式for循环
    iparis一般用来遍历数组从1,2…;paris一般用来遍历表(键值对),它也可以遍历数组,数组实质上就是键为1,2…的,元素为值的表;如果表的元素里从1,2连续开始的,也可以使用ipairs访问1,2…等的键值对。

Lua 教程 lua Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。 设计目的 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua 特性 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。 其它特性: 支持面向过程(procedure-oriented)编程和函数式编程(functional programming); 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象; 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持; 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。 Lua 应用场景 游戏开发 独立应用脚本 Web 应用脚本 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench 安全系统,如入侵检测系统
lua中文教程,原名:programming in lua 目录 版权声明..............i 译序..i 目录iii 第一篇语言.......1 第0章序言.......1 0.1 序言..........1 0.2 Lua的使用者................2 0.3 Lua的相关资源............3 0.4 本书的体例.................3 0.5 关于本书...3 0.6 感谢..........4 第1章起点.......5 1.1 Chunks.......5 1.2 全局变量...7 1.3 词法约定...7 1.4 命令行方式.................7 第2章类型和值9 2.1 Nil..............9 2.2 Booleans....9 2.3 Numbers...10 2.4 Strings......10 2.5 Functions.12 2.6 Userdata and Threads.12 第3章表达式..13 3.1 算术运算符...............13 3.2 关系运算符...............13 3.3 逻辑运算符...............13 3.4 连接运算符...............14 3.5 优先级.....15 3.6表的构造..15 第4章基本语法................18 4.1 赋值语句.18 4.2 局部变量与代码块(block)......19 4.3 控制结构语句...........20 Programming in Lua iv Copyright ® 2005, Translation Team, www.luachina.net 4.4 break和return语句......23 第5章函数......24 5.1 返回多个结果值.......25 5.2可变参数..27 5.3 命名参数.28 第6章再论函数................30 6.1 闭包........32 6.2 非全局函数...............34 6.3 正确的尾调用(Proper Tail Calls)...36 第7章迭代器与泛型for....40 7.1 迭代器与闭包...........40 7.2 范性for的语义...........42 7.3 无状态的迭代器.......43 7.4 多状态的迭代器.......44 7.5 真正的迭代器...........45 第8章编译·运行·调试47 8.1 require函数.................49 8.2 C Packages.................50 8.3 错误........51 8.4 异常和错误处理.......52 8.5 错误信息和回跟踪(Tracebacks)....53 第9章协同程序................56 9.1 协同的基础...............56 9.2 管道和过滤器...........58 9.3 用作迭代器的协同...61 9.4 非抢占式多线程.......63 第10章完整示例..............68 10.1 Lua作为数据描述语言使用........68 10.2 马尔可夫链算法.....71 第二篇 tables与objects........75 第11章数据结构..............76 11.1 数组......76 11.2 阵和多维数组.........77 11.3 链表......78 11.4 队列和双端队列.....78 11.5 集合和包.................80 11.6 字符串缓冲.............80 第12章数据文件与持久化..................84 12.1 序列化...86 Programming in Lua v Copyright ® 2005, Translation Team, www.luachina.net 第13章 Metatables and Metamethods...92 13.1 算术运算的Metamethods............92 13.2 关系运算的Metamethods............95 13.3 库定义的Metamethods................96 13.4 表相关的Metamethods................97 第14章环境..103 14.1 使用动态名字访问全局变量...103 14.2声明全局变量........104 14.3 非全局的环境.......106 第15章 Packages.............109 15.1 基本方法...............109 15.2 私有成员(Privacy)................111 15.3 包与文件................112 15.4 使用全局表............113 15.5 其他一些技巧(Other Facilities)...115 第16章面向对象程序设计.................118 16.1 类.........119 16.2 继承.....121 16.3 多重继承...............122 16.4 私有性(privacy)...................125 16.5 Single-Method的对象实现方法127 第17章 Weak表...............128 17.1 记忆函数...............130 17.2 关联对象属性.......131 17.3 重述带有默认值的表...............132 第三篇标准库134 第18章数学库................135 第19章 Table库...............136 19.1数组大小................136 19.2 插入/删除..............137 19.3 排序.....137 第20章 String库..............140 20.1 模式匹配函数.......141 20.2 模式.....143 20.3 捕获(Captures).146 20.4 转换的技巧(Tricks of the Trade)151 第21章 IO库..157 21.1 简单I/O模式..........157 21.2 完全I/O 模式........160 Programming in Lua vi Copyright ® 2005, Translation Team, www.luachina.net 第22章操作系统库........165 22.1 Date和Time............165 22.2 其它的系统调用...167 第23章 Debug库..............169 23.1 自省(Introspective)..............169 23.2 Hooks...173 23.3 Profiles.174 第四篇 C API..177 第24章 C API纵览..........178 24.1 第一个示例程序...179 24.2 堆栈.....181 24.3 C API的错误处理..186 第25章扩展你的程序....188 25.1 表操作.189 25.2 调用Lua函数.........193 25.3 通用的函数调用...195 第26章调用C函数..........198 26.1 C 函数..198 26.2 C 函数库................200 第27章撰写C函数的技巧..................203 27.1 数组操作...............203 27.2 字符串处理...........204 27.3 在C函数中保存状态.................207 第28章 User-Defined Types in C........212 28.1 Userdata.................212 28.2 Metatables..............215 28.3 访问面向对象的数据...............217 28.4 访问数组...............219 28.5 Light Userdata........220 第29章资源管理............222 29.1 目录迭代器...........222 29.2 XML解析...............225
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值