lua 自学笔记5

//12 所有的关系操作符的运算结果都是true或false
//注意:
2<15 --->true
"2" < "15" --->false   //这是按顺序比较,它会先比较"2"和"1"

//13 逻辑操作符(and、or、not)都将false和nil视为假
(1)and、or都是短路求值
print(4 and 5)  --->5
//and如果第一个操作数是假的返回第一个操作数,否则返回第二个操作数
print(4 or 5)  ----->4 
//or如果第一个操作数为真的返回第一个操作数,否则返回第二个操作数

//14 优先级
^指数操作符和链接操作符".."是右结合的,其他操作符都是左结合的




//16 局部变量与块
j = 10 //全局变量
local i = 1 //局部变量 

//17 repeat重复执行循环体直到条件为真时结束(至少会执行一次)
repeat 
line = io.read()
until line ~= ""
print(line)
//打印输入不为空的第一行内容

//18 return/break用于跳出当前的块,一般不需要返回值的时候不用return,但是如果你希望在函数中插入一句return或break
//do return end 这样的格式来插入


//19 unpack(a)  a作为数组,unpack函数将返回数组a中所有值


//20函数
(1)lua的函数可以返回多个值 return num1,num2
(2)lua的参数可以不定长度
function add(...)
local s = 0 
for i,v in ipairs{...} do
s = s + v
end
return s
end
(3)具名实参
(4)闭合函数
将一个函数写在一个函数的里面,里面的函数可以调用外面函数内的变量
(5)非全局的函数
local function f(<参数>)
<函数体>
end 
在使用递归方法调用函数时应该这样写:
local foo //先定义局部变量再定义函数本身
foo = function(n)
if n==0 then return 1
else return n*foo(n-1)
end
end

function foo(n)
if n > 0 then return foo(n-1) end
end

(6)正确的尾调用
尾调用不会耗费栈空间,正确格式:
return <func>(<args>)

//21 格式化文本string.format
function fwrite(fmt,...)
return io.write(string.format(fmt,...))
end

//21 迭代器(closure)、ipairs 都是遍历
(1)不同之处:
ipairs:
ipairs返回数组的索引和该索引里的值;
格式:for i,v in ipairs(a) do print(v) end

迭代器(closure):
迭代器是返回元素的值,不返回索引;
格式:
先定义一个函数
function values(t)
local i = 0
return function() 
i=i+1;
return t[i]
end
end
再在一个while循环中使用这个迭代器:
t = {10,20,30}
iter = values(t)    --创建迭代器
while true do
local element = iter()  --调用迭代器
if element == nil then break end
print(element)
end
//没有泛型for来得简便

猜你喜欢

转载自blog.csdn.net/lvyan1994/article/details/53037055