Lua学习笔记1

1.lua的设计目的

其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

2.lua的特点

  • 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
  • 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
  • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming)
  • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
  • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
  • 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。

3.关键字

以下列出了 Lua 的保留关键词。保留关键字不能作为常量或变量或其他用户自定义标示符:

andbreakdoelse
elseifendfalsefor
functionifinlocal
nilnotorrepeat
returnthentrueuntil
whilegoto

一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量,所以尽量不要下划线开头加大写字母定义变量。

4.全局变量

变量一般默认全局

定义变量时必须赋值,否则会报错!!!

你可以理解为,lua的赋值就是创建变量

如果你想删除一个全局变量,只需要将变量赋值为nil,换句话说, 当且仅当一个变量不等于nil时,这个变量即存在。

5.一些使用案例和类型介绍

print("nima")
--输出
--nima

--lua是解释性语言,一行一行编译运行

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

--lua变量由字母、数字、下划线构成,数字不能作为开头
--尽量不要用下划线+大写字母形式命名
--不允许采用特殊字符命名 如¥@
--lua区分大小写

--lua关键字
--与 或 非	and or not
--if else elseif
--for循环	while循环	repeat until循环
--对错 true false
--[[
函数定义	没有大括号
function end
in local nil break then return
]]--


--lua只有八大数据类型

--nil 空		表示一个无效值(在条件表达式中相当于false)
print(type(nil))
--输出
--nil

--bool 布尔类型
--特别注意:
--[[
nil和false为假
其他全为真,0也表示真
]]--
--true false
print(type(false))
print(type(true))
--输出
--boolean
--boolean

--number数字类型
--lua中所有数字类型整型、浮点型都是number类型
--精度默认是双精度
print(type(1))
print(type(1e+1))
print(type(1.2535))
--输出
--number
--number
--number

--string字符串
--lua中双引号、单引号或者双中括号都是字符串
print(type("abc"))
print(type('abc'))
print(type([[abc]]))
--拼接输出
print("a".."b")
--输出长度
print(#"abc")
--输出
--string
--string
--string
--ab
--3

--函数function
--[[
function 函数名(参数列表)
	函数体
end
]]--
function function_name()
	print("a".."b")
end
--调用
function_name()
--输出类型
print(type(function_name))
--输出
--ab
--function

--table 表 唯一的数据结构	(只有表有中括号{})
print(type({}))
--输出
--table

--比较少用的两种:

--userdata	自定义数据类型
--用于表示与C/C#/C++交互时所产生的数据集

--thread 线程


--定义变量
--变量是什么类型却决于赋值的类型
--且没有重定义的错误,可理解为覆盖
a=10
print("a的类型"..type(a))
a=true
print("a的类型"..type(a))
a=function_name
print("a的类型"..type(a))
--输出
--a的类型number
--a的类型boolean
--a的类型function


--全局变量   局部变量  表中的域
--lua中定义的变量默认是全局变量
--lua中定义的变量默认是全局变量,除非加local显式声明为局部变量
a=5--全局变量
function Test()
	b=3;--全局变量
	local c=0--局部变量
end
print(b,c)
--输出
--nil	nil
Test()
print(b,c)
--输出
--3	nil


--赋值语句
--改变一个变量的值或者改变表域的基本方法
c=4


--多变量赋值
--多变量赋值,变量列表和值列表各个元素用逗号隔开,
--赋值语句右边的值会依次赋值给左边的变量
a,b=1,2
print(a,b)
--输出
--1	2

--交换两个变量的值
a,b=b,a
print(a,b)
--输出
--2	1

--当变量的个数和值的个数不一致时
--1.变量个数大于值的个数,按变量个数补足nil
e,f,g=1,2
print(e,f,g)
--输出
--1	2	nil

--2.变量个数小于值的个数,多余的值被忽略
e,f=4,5,6
print(e,f,g)
--输出
--4	5	nil


--循环语句
--while
--[[
while 条件
do
	循环体
end
]]--
while a<10
do
	print("循环值a:",a)
	--注意:lua里没有++或+=的操作
	a=a+1
end
--输出
--[[
循环值a:	2
循环值a:	3
循环值a:	4
循环值a:	5
循环值a:	6
循环值a:	7
循环值a:	8
循环值a:	9
]]--

--repeat..until
--相当于c中的do while
--[[
repeat
	循环体
until(条件)
]]--
a=1
repeat
	print("循环值a:",a)
	a=a+1
until a>10
--输出
--[[
循环值a:	1
循环值a:	2
循环值a:	3
循环值a:	4
循环值a:	5
循环值a:	6
循环值a:	7
循环值a:	8
循环值a:	9
循环值a:	10
]]--

--for循环	数值型for
--第三个参数可以缺省,缺省默认变化为1
--[[
for i=起始值,结束值,变化的值
do
	循环体
end
]]--
for i=1,10,3
do
	print("循环值i:",i)
end
--输出
--[[
循环值i:	1
循环值i:	4
循环值i:	7
循环值i:	10
]]--


--if else  elseif
--1
if(a>5)then
	print("one")
end
--2
if a>5 then
	print("one")
end
--3
if(a>5)then
	print("one")
else
	print("two")
end
--4
if a>5 then
	print("one")
elseif a<5 then
	print("two")
elseif a==5 then
	print("three")	
end
--输出
--one
--one
--one
--one



--表 {}   lua唯一的数据结构   
--lua表的底层是由哈希表+数组实现的
--lua里的表可以直接看作哈希表
--lua里的数组下标从1开始的

--lua会根据开发者存储的数据去选择合适的数据结构,比如表用作数组时,底层通常会用
--数组形式去实现,如果是键值对,那底层也用键值对形式存储

tab={["key"]="value",["key1"]=value2,[1]="value3",["2"]="value4",[3]=3}
print(type(tab))
--["key"]="value"	键值对形式
--两种访问方式
print("索引为key的值:",tab["key"])
print("索引为key的值:",tab.key)
print("索引为key1的值:",tab["key1"])
print("索引为key1的值:",tab.key1)
print("索引为key2的值:",tab[key2])
print("索引为key2的值:",tab.key2)
--当key为数字类型时就不能采用点号访问 
print("索引为1的值:",tab[1])
--print("索引为1的值:",tab.1)
--当key为数字字符串类型时就不能采用点号访问
print("索引为2的值:",tab["2"])
--print("索引为2的值:",tab."2")
print("索引为3的值:",tab[3])
print(#tab)
--输出
--[[
table
索引为key的值:	value
索引为key的值:	value
索引为key1的值:	nil
索引为key1的值:	nil
索引为key2的值:	nil
索引为key2的值:	nil
索引为1的值:	value3
索引为2的值:	value4
索引为3的值:	3
1
]]--

--[key2]="value3" 该赋值不被允许
--原因:索引值不能为nil
--为什么key2是nil
--[[
因为key2不属于八大类型之一,而变量赋值由
赋值的值类型决定,因此给值nil
]]--

--泛型for
--ipairs/pairs:迭代器

--ipairs:遍历时固定的从key为1开始,每次遍历key会累加1,
--如果key所对应的值不存在,则停止遍历
--形式
--for k,v in ipairs(表名) do
--	print(k,v)
--end
for k,v in ipairs(tab) do
	print(k,v)
end
--输出
--1	value3


--pairs:会遍历表中的所有的键值对,即便pairs遇到了key所对应的值不存在,
--还是会继续遍历,而ipairs遇到nil就停止遍历
--形式
--for k,v in pairs(表名) do
--	print(k,v)
--end
for k,v in pairs(tab) do
	print(k,v)
end
--输出
--key	value
--2	value4
--1	value3
--3	3


--[[
如果表中为哈希表和数组混合时,lua会自动补替索引,key是从1开始补的
如果该key已经被占用了,就会覆盖掉
]]--
tab1={[1]="a","c",[3]="b"}
print("tab1lenth:",#tab1)
for k,v in pairs(tab1) do
	print("tab1:",k,v)
end
--输出
--tab1lenth:	1
--tab1:	1	c
--tab1:	3	b
tab2={[2]="a",[1]="c",[3]="b"}
--输出
print("tab2lenth:",#tab2)
--tab2lenth:	3
tab3={[2]="a",[4]="c",[3]="b"}
--输出
print("tab3lenth:",#tab3)
--tab3lenth:	0
--#底层应该也是用ipairs来计算的
--它会从1开始计数,一直计算连续的数组,中断后输出中断前的个数
--因此print(#tab)
--结果为1

--如果key不是连续的
--自己定义函数去实现
tab={[1]="a",[3]="b"}
--求长度
function CalcluTableLength()
	local count=0
	for k,v in pairs(tab) do
		count=count+1
	end
	return count
end
print("长度",CalcluTableLength())
--输出
--长度	2

print(#tab)
for i,v in ipairs(tab) do
	print(i,v)
end
--1	a
for k,v in pairs(tab) do
	print(k,v)
end
--1	a
--3	b
tab2={"a","b","c"}
for k,v in pairs(tab2) do
	print(k,v)
end
print(#tab2)
--1	a
--2	b
--3	c
--3

--死循环
--while true
--do
--	print("1")
--end

--循环嵌套
--冒泡排序
tab={3,4,6,1,2,8,3}
for i=1,#tab do
	for j=i+1,#tab do
		if tab[i]>tab[j] then
			tab[i],tab[j]=tab[j],tab[i]
		end
	end
end

for i=1,#tab do
	print(tab[i])
end
--[[
1
2
3
3
4
6
8
]]--

--用表模拟实现list中的add方法
if tab[#tab+1]==nil then
	tab[#tab+1]=100
end
for i=1,#tab do
	print(tab[i])
end
--[[
1
2
3
3
4
6
8
100
]]--
--循环控制语句
a=1
while a<10
do
	print("a的值为:",a)
	a=a+1
	if(a>5)then
		break
	end
end
--[[
a的值为:	1
a的值为:	2
a的值为:	3
a的值为:	4
a的值为:	5
]]--

--模拟实现continue效果
for i=1,10 do
	repeat
		if i==5 then
			print("跳过")
			break
		end
		print("i=",i)
	until true
end
--[[
i=	1
i=	2
i=	3
i=	4
跳过
i=	6
i=	7
i=	8
i=	9
i=	10
]]--

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值