练习1. 大多数C语法风格的编程语言都不支持elseif结构,为什么Lua语言比这些语言更需要这种结构?
Lua语言不支持switch语言,每个代码块结束都有一个end,elseif结构比多个if性能更高
练习2. 描述Lua语言中实现无条件循环的4种不同方法,你喜欢哪一种?
while true do
expression
end
for i = 1, math.huge do
expression
end
repeat
expression
until nil
::s1:: do
expression
goto s1
end
练习3:很多人认为,repeat-until 很少使用,因此在像Lua语言这个的简单的编程语言最好不要出现,你怎么看?
repeate-until类似于do-while 语句,都是先执行后判断,保证会执行一遍,Lua语言没有do-while,可以用repeate-until实现。
注意:do-while是条件不成立是退出循环,repeate-until是条件成立时退出循环
练习4:
function room1()
local move = io.read()
if move == "south" then
return room3()
elseif move == "east" then
return room2()
else
print("invalid move")
return room1()
end
end
function room2()
local move = io.read()
if move == "south" then
return room4()
elseif move == "west" then
return room1()
else
print("invalid move")
return room2()
end
end
function room3()
local move = io.read()
if move == "north" then
return room4()
elseif move == "east" then
return room1()
else
print("invalid move")
return room3()
end
end
function room4()
print("Congratulations, you won!")
end
room1()
练习5:请解释一下为什么Lua语言会限制goto语句不能跳出一个函数。
答:不同函数之间如果能使用goto跳转会导致代码可读性变差,不利于维护,其次,直接跳转到某个变量的作用域,却绕过了变量的声明将会发生无法预料的错误
练习6:假设goto语句可以跳转出函数,请说明实例8.3中程序将会如何执行。请试着解释为什么标签要使用与局部变量相同的作用范围规则。
-- 一种诡异且不正确的goto语句的使用
function getlabel()
return function() goto L1 end -- 执行到这一步会出错,Lua语言不允许goto跳转到函数外
::L1::
return 0
end
function f(n)
if n == 0 then return getlabel()
else
local res = f(n - 1)
print(n)
return res
end
end
x = f(10)
x()
答:假设标签是全局的,此时使用goto直接跳转到某个变量的作用域,却绕过了变量的声明会发生无法预料的问题