Lua 语言学习
详细讲解见菜鸟教程 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 语言学习的更多相关文章
- GJM : Lua 语言学习笔记
Lua笔记 容易与C/C++整合 Lua所提供的机制是C所不善于的:高级语言,动态结构,简洁,易于测试和调试. Lua特有的特征: `1:可扩展性.卓越的扩展性导致了很多人将Lua用作搭建领域语言的工 ...
- Lua语言学习
1,语法 语句不用分号结尾 function ... end if .. else .. end 2, io库, string库, table库, OS库, 算术库, debug库 3, dofile ...
- 51CTO专访淘宝清无:漫谈Nginx服务器与Lua语言
http://os.51cto.com/art/201112/307610.htm 说到Web服务器,也许你第一时间会想到Apache,也许你会想到Nginx.虽然说Apache依然是Web服务器的老 ...
- lua语言入门之Sublime Text设置lua的Build System
转自: http://blog.csdn.net/wangbin_jxust/article/details/8911956 最近开始学习LUA语言,使用Sublime Text作为编辑器,不得不说, ...
- 编译并使用Lua语言
Lua是一个小巧的脚本语言,该语言设计的目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. 可扩展性.Lua的扩展性非常卓越,可以通过Lua代码或C代码扩展,很多功能可以通过外部库来扩 ...
- lua本学习笔记功能
Lua本学习笔记功能 1. 函数返回 指定任务的主要功能是完成,在这种情况下,函数被用作调用语句.函数可以计算并返回值,在这种情况下,作为分配值表达式语句使用. 语法: funcationfunc_ ...
- [2017.02.07] Lua入门学习记录
#!/home/auss/Projects/Qt/annotated/lua -- 这是第一次系统学习Lua语言 --[[ 参考资料: 1. [Lua简明教程](http://coolshell.cn ...
- lua脚本之lua语言简介以及lua的安装
本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解. 一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设 ...
- Lua语言中文手册 转载自网络
Programming in LuaCopyright ® 2005, Translation Team, www.luachina.net Programming in LuaProgramming ...
随机推荐
- 【java8】慎用java8的foreach循环(作废)
+警告 这篇文章作废掉,是由一个错误的测试方法得到的一个错误结论,后续修正结果正在测试,将贴上. 准确测试已完成:http://www.cnblogs.com/yiwangzhibujian/p/69 ...
- maven打包 springBoot 工程时,默认识别resources目录,习惯使用 resource 目录的需要手动指定静态资源目录
最近项目开发,发现springBoot项目在使用maven打包时,我们静态资源文件都放在resource目录下面,大致如下: 在使用maven打包时,发现静态资源没有打进去.原来springBoot默 ...
- Chrome 插件推荐
我在这里就是抛砖引玉,各位开发者,有更好的插件请不要吝啬,分享出来. 希望世界和平! 翻译类 沙拉查词 目前使用,感觉挺好的,各种词典,还有统计.划词划句都可以翻译出来. JSON 格式转换 JSON ...
- zabbix系列之三——安装报错
1Zabbix_server启动失败 1.1查看日志:vi /var/log/zabbix/zabbix_server.log zabbix_server [23500]: cannot open l ...
- 解决国外模板h1、h2、h3...不显示中文文章标题的问题
如果你经常用国外好看的网页模版时候,会遇到不显示中文文章标题的情况,显示英文标题却正常.遇到这个情况很多人认为应该修改CSS的font-family的字体,其实这是错误的,与CSS无关. 出现这种情况 ...
- ExpressRoute 连接模型
可通过以下三种不同方式,创建本地网络和 Azure 云之间的连接:CloudExchange 归置.点对点以太网连接和任意位置之间的 (IPVPN) 连接.连接服务提供商可以提供一个或多个连接模型.可 ...
- Oracle EBS AP银行显示不全
- 【gp数据库】查询系统表看模式下所有表的分布键信息
Greenplum是关系型的分布式数据库,需要存储的数据库在进入数据库时,将先进行数据分布的处理工作,讲一个表的数据平均分不到每个节点上,并为每个表指定一个分发列(distribute Column) ...
- JQuery 常用命令总结
下面介绍在jQuery中设置form表单中action的值的方法. $("#myFormId").attr("action", "userinfo.s ...
- [翻译] FBNetworkReachability
FBNetworkReachability You can use FBNetworkReachabilty class to get network reachability on iOS devi ...