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 ...
随机推荐
- JConsole监控Java程序的运行情况
JConsole 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松 ...
- 11.Spring——JDBC框架
1.DBC 框架概述 2.Spring JDBC 示例 3.Spring 中 SQL 的存储过程 1.DBC 框架概述 在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关 ...
- Linux Transparent Huge Pages 对 Oracle 的影响
1 Transparent Huge Pages 说明 官网上有2篇文章对THP 做了说明: https://access.redhat.com/solutions/46111 https://acc ...
- 可以简易设置文字内边距的EdgeInsetsLabel
可以简易设置文字内边距的EdgeInsetsLabel 最终效果: 源码: EdgeInsetsLabel.h 与 EdgeInsetsLabel.m // // EdgeInsetsLabel.h ...
- Elasticsearch部分节点不能发现集群(脑裂)问题处理
**现象描述** es1,es2,es3三台es组成一个集群,集群状态正常, 当es1 服务器重启后,es1不能加到集群中,自己选举自己为master,这就产生了es集群中所谓的“脑裂” , 把es1 ...
- Python学习---IO的异步[twisted模块]
安装twisted模块 Linux: pip3 install twisted Window: a. http://www.lfd.uci.edu/~gohlke/pythonlibs/#twiste ...
- Windows下Git使用报错:warning:LF will be replaced by CRLF in ××××.××
Windows下Git使用报错: warning:LF will be replaced by CRLF in ××××.××(文件名) The file will have its original ...
- EntityFramework Code First便捷工具——数据迁移
使用EntityFramework Code First开发,数据迁移是一个不得不提的技术. 在我们的开发过程中,难免需要对模型进行改进,模型改进后,会导致实体集与数据库不一致,当然我们可以通过删除数 ...
- Array对象常用方法
不改变原数组: 1.concat() 连接两个或多个数组 不改变原数组 返回被连接数组的一个副本 2.join() 把数组中所有元素放入一个字符串 不改变原数组 返回字符串 3.slice() ...
- 关于移动端APP开发-字体样式变大问题
前两天在写App项目的时候发现一个问题,就是明明css写的样式是14px,刚开始在页面显示时并未出现问题,可是内容一多,字体突然变大了. what?,不明所以,在各大网站上找了好久才知道是浏览器的字体 ...