详细讲解见菜鸟教程 Lua

一、数据类型

 -- 直接输出
print("hello") -- 全局变量
b =
print(b) -- nil(空)
print(type(a))
-- 对于全局变量和table,nil 还有清空的作用 -- number(数字)
-- Lua 默认只有一种number类型 -- double(双精度) -- string(字符串)
-- 字符串由一对双引号或单引号来表示
string1 = "this is string1"
string2 = 'this is string2'
-- 在尝试对一个数字字符串进行算术操作时,Lua会尝试将数字字符串转换成数字
print("" + )
-- 字符串连接 ..
print( .. )
-- 字符串长度 #
print(#string1) -- table(表)
a = {}
-- 数组的索引可以为数字或者字符串
a["key"] = "value"
key =
a[key] =
-- 遍历
for k,v in pairs(a) do
print(k .. ":" .. v)
end
-- Lua里表的初始索引一般以 1 开始,而不是 0
-- table 长度不固定,会自动增加 -- function(函数)
-- 函数名字f,包含一个参数 n
-- 主要实现阶乘的计算
function f(n)
if n== then
return
else
return n * f(n-)
end
end
-- 调用函数
print(f())
-- 函数可以存储在一个变量中
f1 = f
print(f1()) -- 匿名函数参数传递
-- 函数名 f1,有两个参数,其中第二个参数为一个函数
function f1(tab, f2)
for k, v in pairs(tab) do
-- 输出函数返回的值
print(f2(k, v))
end
end -- 新建表
tab = {"a", "b", "c"}
-- 调用函数,匿名函数作为参数传入
-- 注意key是从1开始的
f1(tab,
function(key, val) -- 匿名函数
return key .. " = " .. val
end
) -- 变量
a = -- 全局变量
local b = -- 局部变量
-- Lua可以对多个变量同时赋值
x,y = ,
print(x .. "," .. y)
-- 交换x,y的值
x,y = y,x
print(x .. "," .. y)
-- 多值赋值也可用来接收函数返回的多个变量
function f()
return ,
end
x,y = f()
print(x .. "," .. y)

二、循环

 -- while 语句
a =
-- 从10输出到20
while(a < )
do
print("a = " .. a)
a = a +
end -- for 语句
-- 数值for循环
-- 从10变化到1,每次步长为-1
for i=, , - do
print("i = " .. i)
end
-- 泛型for循环
days = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
-- i为数组索引值,v是对应索引的数组元素值,ipairs为迭代器
for i,v in ipairs(days) do
print(v)
end -- repeat...until 语句
-- 循环直到a>15
a =
repeat
print(a)
a = a +
until(a > ) -- break 语句
for a = ,,- do
print(a)
if(a < )
then
break -- 当a<5,跳出循环
end
end

三、流程控制

 -- if...elseif..else 语句
a =
if(a == )
then -- a=10
print("a 的值为 10")
elseif(a == )
then -- a=20
print("a 的值为 20")
else -- 没有匹配。注意不需要then
print("没有匹配的值")
end -- if嵌套语句
a =
b =
if(a == )
then -- a=100
if(b == )
then -- a=100且b=200
print("a = " .. a .. " b = " .. b)
end
end

四、函数

 -- 多返回值
-- 寻找最大值和最大值所在的位置
function maximum(a)
local mi = -- 最大值位置
local m = a[mi] -- 最大值
for k,v in ipairs(a) do
if(v > m) then -- 更大
m = v
mi = k
end
end
return m, mi -- 输出最大值及其索引
end -- 输出最大值及其索引
print(maximum({, , , , , })) -- 可变参数
-- 求不确定参数个数的平均值
function averge(...)
result =
-- 可变参数可以赋值给变量
local arg = {...}
for k,v in ipairs(arg) do
result = result + v
end
-- #可以获取...长度
print("总共传入 " .. #arg .. " 个数")
-- 返回平均值
return result/#arg
end -- 输出平均值
print("平均值为 " .. averge(, , , , , ))

五、运算符

 -- 算术运算符
-- + - * / 加减乘除
-- % 取余 ^ 乘幂 - 负号 -- 关系运算符
-- == 等于 ~= 不等于
-- > < >= <= 大于 小于 大于等于 小于等于 -- 逻辑运算符
-- and 逻辑与 or 逻辑或 not 非 -- 其他运算符
-- .. 连接两个字符串
-- # 返回字符串或表的长度

六、字符串

 -- 字符串大小写转换
s = "Lua"
print(string.upper(s)) -- 大写
print(string.lower(s)) -- 小写 -- 字符串查找与反转
s = "Lua Tutorial"
-- 查找字符串,若查找成功,返回头和尾,否则返回nil
print(string.find(s, "Tutorial"))
-- 字符串反转
reverses = string.reverse(s)
print(reverses) -- 字符串格式化
date =
month =
year =
-- 日期格式化
print(string.format("%02d/%02d/%04d", date, month, year))
-- 十进制格式化
print(string.format("%.3f", /)) -- 字符与ASCII码的转换
-- 转换第一个字符
print(string.byte("Lua"))
-- 转换第三个字符
print(string.byte("Lua", ))
-- 转换倒数第一个字符
print(string.byte("Lua", -))
-- ASCII转字符
print(string.char()) -- 字符串长度
s = "Lua Tutorial"
print(string.len(s)) -- 模式匹配
-- 搜索 dd/mm/yy 格式的日期
s = "Deadline is 30/05/1999, firm"
date = "%d%d/%d%d/%d%d%d%d"
print(string.sub(s, string.find(s, date)))
-- 去除空格
-- gsub 返回的第二个参数为替代字符的个数
print(string.gsub(s, " ", ""))

七、数组

 -- 一维数组
array = {}
-- 初始化数组
-- 注意数组下标默认从1开始,但是也可以自定义下标
for i=-, do
array[i] = i*
end
-- 遍历数组
for i=-, do
print(array[i])
end -- 二维数组
array = {}
maxRow =
maxColumn =
-- 初始化3行3列数组
for row=,maxRow do
array[row] = {}
for col=,maxColumn do
array[row][col] = row * col
end
end
-- 遍历数组
for row=,maxRow do
for col=,maxColumn do
print(array[row][col])
end
end

八、迭代器

 -- pairs和ipairs区别
-- pairs 可以遍历集合的所有元素,即可以遍历集合中的所有key
-- ipairs 按照索引升序遍历,索引中断停止遍历
tab = {
[] = "a",
[] = "b",
[] = "c" -- 注意索引值没有3
} -- pairs
-- 输出 a,b,c
for k, v in pairs(tab) do
print(v)
end -- ipairs
-- 只输出 a,b
for k, v in ipairs(tab) do
print(v)
end

九、表(table)

 -- 初始化表
mytable = {}
-- 指定值
mytable[] = "Lua"
-- 移除引用
-- 之后Lua垃圾回收会释放内存
mytable = nil -- table 连接
fruits = {"banana","orange","apple"}
-- 直接连接
print(table.concat(fruits))
-- 指定连接字符
print(table.concat(fruits, ","))
-- 指定要连接的字符串
print(table.concat(fruits, ", ", , )) -- 插入和删除
fruits = {"banana","orange","apple"}
-- 在末尾插入
table.insert(fruits, "watermelon")
print(table.getn(fruits))
-- 在指定位置插入
table.insert(fruits, , "pear")
print(fruits[])
print(table.getn(fruits))
-- 删除指定位置的元素
print(table.remove(fruits, ))
print(table.getn(fruits)) -- 排序
fruits = {"banana","orange","apple","grapes"}
print("排序前")
for k,v in ipairs(fruits) do
print(k,v)
end -- 排序,默认为升序
table.sort(fruits)
print("排序后")
for k,v in ipairs(fruits) do
print(k,v)
end -- 注意使用 # 和 table.getn 其都会在索引中断的地方停止计数,
-- 而导致无法正确取得 table 的长度
-- 可以用以下的方法
function table_leng(t)
local leng=
for k, v in pairs(t) do
leng=leng+
end
return leng
end

十、模块

  模块代码如下:

 -- module.lua
-- 定义一个名为 module 的模块
module = {} -- 定义一个常量
module.constant = "这是一个常量" -- 定义一个函数
function module.func1()
io.write("这是一个公有函数!\n")
end local function func2()
print("这是一个私有函数!")
end function module.func3()
func2()
end return module

  调用模块代码如下:

 -- 加载模块
-- 返回一个由模块常量和函数组成的table
local m = require("module") print(m.constant) -- 访问模块常量
m.func3() -- 访问模块函数

十一、协同程序

 -- 协同程序
-- 创建协程,resume时唤醒函数
co = coroutine.create(
function(i)
print(i);
end
) -- 重启协程,并传入参数
coroutine.resume(co, ) --
-- 输出协程状态
print(coroutine.status(co)) -- dead print("----------") -- 作用与create一样
co = coroutine.wrap(
function(i)
print(i);
end
) co() print("----------") -- create时就是在新线程中注册一个事件
co2 = coroutine.create(
function()
for i=, do
print(i)
if i == then
print(coroutine.status(co2)) --running
print(coroutine.running()) --thread:XXXXXX
end
-- 遇到yield协程会暂时挂起
coroutine.yield()
end
end
) -- resume会重新激活事件
coroutine.resume(co2) --
coroutine.resume(co2) --
coroutine.resume(co2) -- print(coroutine.status(co2)) -- suspended
print(coroutine.running()) print("----------")

十二、文件 I/O

 -- 文件 I/O
-- 打开文件
file = io.open("协同程序.lua", "r") -- 输出文件第一行
print(file:read()) -- 获取倒数第10个字符位置
file:seek("end",-)
-- 读取后10个字符
print(file:read("*a")) -- 关闭文件
file:close() -- 以附加的方式打开只写文件
file = io.open("协同程序.lua", "a") -- 在文件末尾写入字符串
file:write("-- test io")

十三、面向对象

 -- 面向对象
-- Shape 类,包含一个属性 area
Shape = {area = } -- 构造方法
function Shape:new (o, side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or
self.area = side*side
return o
end -- 输出形状面积
function Shape:printArea()
print("面积为:", self.area)
end -- 创建对象
myShape = Shape:new(nil, )
-- 输出面积
myShape:printArea() -- -- 继承
-- 长方形
Rectangle = Shape:new()
-- 派生类构造方法
function Rectangle : new(o, length, breadth)
o = o or Shape:new(o)
setmetatable(o, self)
self.__index = self
self.area = length * breadth
return o
end -- 函数重写
function Rectangle : printArea()
print("长方形面积为:", self.area)
end -- 创建一个长方形对象
myRectangle = Rectangle:new(nil, , )
-- 输出长方形面积
myRectangle:printArea() --

Lua 语言学习的更多相关文章

  1. GJM : Lua 语言学习笔记

    Lua笔记 容易与C/C++整合 Lua所提供的机制是C所不善于的:高级语言,动态结构,简洁,易于测试和调试. Lua特有的特征: `1:可扩展性.卓越的扩展性导致了很多人将Lua用作搭建领域语言的工 ...

  2. Lua语言学习

    1,语法 语句不用分号结尾 function ... end if .. else .. end 2, io库, string库, table库, OS库, 算术库, debug库 3, dofile ...

  3. 51CTO专访淘宝清无:漫谈Nginx服务器与Lua语言

    http://os.51cto.com/art/201112/307610.htm 说到Web服务器,也许你第一时间会想到Apache,也许你会想到Nginx.虽然说Apache依然是Web服务器的老 ...

  4. lua语言入门之Sublime Text设置lua的Build System

    转自: http://blog.csdn.net/wangbin_jxust/article/details/8911956 最近开始学习LUA语言,使用Sublime Text作为编辑器,不得不说, ...

  5. 编译并使用Lua语言

    Lua是一个小巧的脚本语言,该语言设计的目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. 可扩展性.Lua的扩展性非常卓越,可以通过Lua代码或C代码扩展,很多功能可以通过外部库来扩 ...

  6. lua本学习笔记功能

    Lua本学习笔记功能 1.  函数返回 指定任务的主要功能是完成,在这种情况下,函数被用作调用语句.函数可以计算并返回值,在这种情况下,作为分配值表达式语句使用. 语法: funcationfunc_ ...

  7. [2017.02.07] Lua入门学习记录

    #!/home/auss/Projects/Qt/annotated/lua -- 这是第一次系统学习Lua语言 --[[ 参考资料: 1. [Lua简明教程](http://coolshell.cn ...

  8. lua脚本之lua语言简介以及lua的安装

    本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解.  一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设 ...

  9. Lua语言中文手册 转载自网络

    Programming in LuaCopyright ® 2005, Translation Team, www.luachina.net Programming in LuaProgramming ...

随机推荐

  1. 2.CSS使用基础(1)

    目录 一.css颜色的四种表示法 二.使用css 4种方式 三.css注释: 四.CSS Id 和 Class选择器 五.多重样式优先级顺序 六.CSS Backgrounds(背景) 七.CSS T ...

  2. Azure 镜像市场虚拟机映像制作指南

    本指南为 Azure 镜像市场(以下简称 Azure 镜像市场)独立软件供应商介绍制作虚拟机映像并上传到Azure的主要过程. 制作虚拟机映像有两种方式.一种是直接在Azure上申请相应的操作系统虚拟 ...

  3. win10下vs2015配置Opencv3.1.0过程详解(转)

    下载安装Opencv3.1.0 下载Opencv3.1.0,进入官网,点击opencv for windows即可下载.  点击运行下载好的文件.实际上,opencv的安装程序就是解压缩文件,个人因为 ...

  4. 【MySQL】Linux下mysql安装全过程——小白入门篇(含有问题详解)

    本次安装操作在申请的腾讯云上实现(版本:CentOS Linux release 7.4.1708 (Core) ). 根据教程实现(中途各种挖坑,填坑...),地址:http://www.runoo ...

  5. 使用CoreData [3]

    使用CoreData [3] 此篇幅介绍CoreData如何升级版本防止崩溃 把你之前创建的实体文件全部删除掉,把沙盒中的数据库文件删除掉,实体只保持一个,然后重新创建出实体文件. - (BOOL)a ...

  6. 封装CoreGraphics的API简化绘图操作

    封装CoreGraphics的API简化绘图操作 效果 说明 1. 将CoreGraphics的API接口抽象为对象,让绘图变得简单易懂 2. 简化常用的绘制操作 3. 源码长期更新 源码 https ...

  7. zabbix 监控iptables

    参看的文章链接忘了...... yum -y install iptstate 1.脚本位置和内容 [root@web1 scripts]# pwd /etc/zabbix/scripts [root ...

  8. U-Mail:多方面因素避免EDM邮件进垃圾箱

    有很多做邮件营销的企业客户给U-Mail来电或来函咨询一件困扰他们的事:群发邮件时,要怎么样才能降低被收件人列入垃圾邮件的概率呢?其实关于这个问题,U-Mail小编已经请资深营销专家解答过多次了,经常 ...

  9. Linux 上安装MyEclipse

    操作系统ubuntu14.04,亲测安装MyEclipse2014成功,且破解成阿功.在安装myeclipse之前,您当然需要安装jdk了,jdk在这里不做介绍 下载 下载linux版本的MyEcli ...

  10. 利用xlst导出多表头的简便方法

    大家都知道在ASP.NET中进行表格导出有很多种办法,aspose,npoi,cvs等等,今天就来介绍xlst,导出多表头.与以往不一样的是我们利用模板,只需要在模板中定义好表格样式,然后绑定数据就可 ...