补充知识
局部变量和代码块
Lua语言中的变量在默认情况下是全局变量,所有的局部变量在使用前必须声明。局部变量的作用域仅仅在声明它的代码块(一个代码块是一个控制结构的主体,或者函数的主题,或者是一个程序段(Lua中一个Lua文件或者交互模式的一行称为程序段))
local x=1
局部变量有常见的作用域,局部变量的声明可以包含初值,未赋初值则为nil。还可以使用do-end程序块。
local a=1,b
x=1
do
local x=3
end
一种常见用法为
--定义局部变量x,使用全局变量x为其赋值,此时相当于x的复制(值类型复制内容,对象只是传递引用,所谓句柄)
-- 当全局变量x改变,对局部不影响,
local x=x
--动态替代函数,则这句之前的所有代码还是使用原先的print
local print=prin_new
如下:
print(1,2,3)
function print_new( ... )
print "new print"
end
local print=print_new
print(1,2,3)
--输出
1 2 3
new print
控制结构
if then else
Lua语言将所有不是false和nil的值看作真(0和空字符串为真)不支持switch
a=59
if a>90 then
print("A")
elseif a>75 then
print("B")
elseif a>=60 then
print("C")
else
print("D")
end
--输出
D
循环结构
- while
i=100
sum=0
while i>0 do
sum=sum+i
i=i-1
end
print(sum)
--输出
5050
- repeat
相当于c语言的do-while。不同在于其循环体内的局部变量的作用域包含测试条件
x=3
sqrt=x/2
repeat
sqrt=(sqrt+x/sqrt)/2
local error =math.abs(sqrt^2-x)
--此时error仍有效
until error<10^-5
print(sqrt)
--输出
1.7320508100147
- for
(1)数值型for
基本语法为:for var=exp1,exp2,exp3 do
body
end
表示var从exp1变化到exp2,每次步长为exp3,exp3可选,默认为1
(2)泛型for
泛型for遍历迭代函数返回的所有值,例如pairs,ipairs,io.lines。可以编写自定义迭代器。其格式为
for <var-list> in <exp-list> do
body
end
- break return 无continue
break与return较为常见。不同的是return在Lua中按照语法只能是代码块中的最后一句,所以在中间输出return需要想办法。
function f( ... )
--直接写有语法错误
-- return
do
return
end
if a==nil then
print ".."
end
end
f()
诡异的地方
--1.居然未报错,但是未起作用
function f( ... )
return
print ".."
end
f()
--输出
...
--2.仍然未报错,仍然未起作用
function f( ... )
print ".."
return
print ".."
end
f()
--输出
...
...
--3.后面加了赋值语句,报错了
function f( ... )
return
i=0
end
f()
- goto
goto的标签要求为 ::标签名::
同时有如下限制(主要思想是避免跳到某个块中,而其中变量未来得及初始化)
(1)标签遵循可见性规则,因此不能直接跳转到一个代码块中的标签(因为代码块中的标签对外不可见)。
(2)不能跳转到函数外(第一条以及保证了不会跳进一个函数)
(3)不能跳转到局部变量的作用域。
Lua语言有个很有用的细节是,局部变量的作用域终止于声明变量的代码块中的最后一个有效的语句处,此时标签被人为是无效的语句。
function f( ... )
local i=4
while i>0 do
i=i-1
if i==2 then
goto continue
end
local t=0
print(i)
::continue::
--随便添加一条语句
--则报错 “jumps into the scope of local 't'”
--s=5
end
end
f()
--输出
3
1
0
**最后:**笔记只做到基础语法部分,也是为了自己忘记了,查起来方便,后面高级部分就看书体会了,到此结束。