详细讲解见菜鸟教程 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. JConsole监控Java程序的运行情况

    JConsole 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松 ...

  2. 11.Spring——JDBC框架

    1.DBC 框架概述 2.Spring JDBC 示例 3.Spring 中 SQL 的存储过程 1.DBC 框架概述 在使用普通的 JDBC 数据库时,就会很麻烦的写不必要的代码来处理异常,打开和关 ...

  3. Linux Transparent Huge Pages 对 Oracle 的影响

    1 Transparent Huge Pages 说明 官网上有2篇文章对THP 做了说明: https://access.redhat.com/solutions/46111 https://acc ...

  4. 可以简易设置文字内边距的EdgeInsetsLabel

    可以简易设置文字内边距的EdgeInsetsLabel 最终效果: 源码: EdgeInsetsLabel.h 与 EdgeInsetsLabel.m // // EdgeInsetsLabel.h ...

  5. Elasticsearch部分节点不能发现集群(脑裂)问题处理

    **现象描述** es1,es2,es3三台es组成一个集群,集群状态正常, 当es1 服务器重启后,es1不能加到集群中,自己选举自己为master,这就产生了es集群中所谓的“脑裂” , 把es1 ...

  6. Python学习---IO的异步[twisted模块]

    安装twisted模块 Linux: pip3 install twisted Window: a. http://www.lfd.uci.edu/~gohlke/pythonlibs/#twiste ...

  7. 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 ...

  8. EntityFramework Code First便捷工具——数据迁移

    使用EntityFramework Code First开发,数据迁移是一个不得不提的技术. 在我们的开发过程中,难免需要对模型进行改进,模型改进后,会导致实体集与数据库不一致,当然我们可以通过删除数 ...

  9. Array对象常用方法

    不改变原数组: 1.concat()  连接两个或多个数组 不改变原数组 返回被连接数组的一个副本 2.join()  把数组中所有元素放入一个字符串 不改变原数组 返回字符串 3.slice()   ...

  10. 关于移动端APP开发-字体样式变大问题

    前两天在写App项目的时候发现一个问题,就是明明css写的样式是14px,刚开始在页面显示时并未出现问题,可是内容一多,字体突然变大了. what?,不明所以,在各大网站上找了好久才知道是浏览器的字体 ...