lua备忘录(二)

--lua的do~while循环是这样写的:
--[[
i=1
repeat --do
	print(i) --注意,repeat循环是不用以do作为代码块的开端的
	i=i+1
until i>=10 --while(i<=10),即i>=10的时候结束循环
]]

--lua中的foreach循环:
--[[
table_1={"one","two","three","four","five"}
table_2={}
--ipairs函数返回一个遍历集合的迭代器,类似于foreach循环,即“返回一个迭代器给value并用它访问集合中的所有元素”

for key,value in ipairs(table_1) do 
	print("key:"..key..",value:"..value)
	table_2[key]=value --遍历并打印table_1,并将其中的值赋给table_2
end
for key in ipairs(table_2) do
	print(table_2[key])
end
]]

--*************lua中的函数*************
--lua中使用function关键字定义一个函数,后跟函数名,与通常的编程语言类似
--[[
function add(x,y)
	return x+y --返回x+y的结果
end
print(add(1,2))  --打印结果
]]
--需要注意的是,lua中形参和实参的数量可以不一致,多出的部分会被lua省略,而缺少的则会成为nil
--lua中的函数还可以有多个返回值
--一个有多个返回值的函数:
--[[
function func()
	return 1,2 --需要多个返回值时,用逗号将返回值隔开
end
x,y=func()
print(x)
print(y)
]]

--另一个例子:找出table中的最大元素和其下标
--[[
function getMax(table)
	local index=1
	local var=table[index]
	for key,value in ipairs(table) do
		if value>var then
			index,var=key,value --等价于:index=key;var=value
		end
	end
	return index,var--返回下标和对应的值
end--end function
local index,var=getMax({2,4,3,5,1,6,9,7,8,1})
print("index:"..index..",var:"..var)
]]

--需要注意的是,如果一个函数不是一个表达式中的最后一个元素,则该函数只返回第一个值
--例子如下:
--[[
function func()
	return 1,2,3
end
local x,y=func(),20
--x:1,y:20
print(x)
print(y)
]]

--还可以把函数定义到table中,像这样
--[[
table={1,function()return "function of the table" end} --类似于匿名函数,table的第二个元素是一个函数
print(table[1])
print(table[2]()) --调用

--还可以这样,将一个函数赋给变量:
local func=function() return "a function" end
table_2={1,func}
print(table_2[2]())
]]

--[[
--对于lua中函数,其参数数量也是可变的
--使用...定义一个可以接受若干参数的函数
function func(...)--...表示函数可以接受若干数量的参数,在函数中访问他们也需要使用...
	for key,value in ipairs{...} do--需要注意的是,...是一个表达式,使用ipairs访问他们时候,要用花括号括起来
		print(value)
	end--end loop
end-- end of function
func(1.0,'2',false,nil)
--在可接受若干参数的函数中,仍然可以使用固定参数,但要保证固定参数处于不定量的参数前边
--像这样
function func_2(arg1,arg2,...)
	print('first arg:'..arg1)
	print('second arg:'..arg2)
	for key,value in ipairs{...} do
		print(value)
	end --end loop
end--end of function
firstArg=1
secondArg=2
func_2(firstArg,secondArg,3,4,5,6)
]]

--补充:定义一个table后,可用.运算符访问其中元素,类似于面向对象编程语言的方式
--[[
obj={name='S0nrEir',age='23',height='180'}
print(obj.name)
print(obj.age)
print(obj.height)
]]


--在lua中,所有函数本质上都是匿名的,在调用函数时,实际上我们都是在访问“持有”该函数的变量
--比如说print函数:
--[[
local log=print
log("another name of function 'print'")
local anotherLog=log
anotherLog("another name of function 'log'")
--同样可以使用这样的方式定义&调用一个函数
local add=function(arg1,arg2) return arg1+arg2 end --一个匿名函数
print(add(10,20))--10+20=30
]]
--lua中的闭包函数:
--闭包函数2即:将一个函数的定义写在另一个函数当中,则该函数可以访问外部函数的局部变量
--[[
function funcClosure()--定义一个闭包函数
	local var=0
	return function()-- 定义一个闭包函数中的匿名函数,返回一个函数的返回值
		var=var+1
		return var
	end -- end of function
end --end of function
f=funcClosure()
f2=funcClosure()
print('first call of f:'..f())
print('second call of f:'..f())
print('first call of f2:'..f2())
--结果是1,2,1
--即:一个闭包函数执行完后 ,其中的局部变量的值会被保留,用于以后的计算
]]




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值