1、Lua支持标准的语句,包括赋值、控制结构、过程调用等等,同时支持一些不太常见的语句,比如多重赋值(Multiple Assignment)以及局部变量声明等等。
2、赋值语句
赋值(Assignment)基本含义就是修改一个变量或者table中字段的值:
a = "hello" .. "world"
t.n = t.n + 1
也支持多重赋值,比如
a,b = 10, 2*x -- 这样a,b 就被分别赋值10和 2*x的值了
因为Lua先对等号右边的所有元素求值,然后才执行赋值,这样可以用于两个变量交换
两边值的个数如果不同的话做如下处理,左边个数多的话多出的被赋值nil,如果左边的个数少的话,右边多余的被丢弃。
这同时可以用于一个函数具有多个返回值的情况,比如
a,b = f(); -- 其中f() 函数具有两个返回值的话就可以分别赋值给 a,b 两个变量
3、局部变量和块(Block)
局部变量的作用域仅限制于声明它们的那个块,一个块(Block)是一个控制结构的执行体、或者是一个函数的执行体或者是一个程序块。
如果定界不明显,可以强制使用 do end 方式显式的定义一个块。
如果一条声明语句没有进行初始化,那么声明的所有变量都会初始化为nil。
4、控制语句
Lua提供了一组小巧的控制结构,包括if条件语句,用于迭代的 while repeat 和 for ,所有的控制结构都有一个显示的终止符号
if for while 都是以end为结尾
repeat 以until作为结尾
5、if then else
比较经典的语法结构
if a <0 then a =0 end
if a >0 then
a = 10
elseif a = 0 then
a = 20
end
6、while
先测试while的条件,如果假的话循环直接结束;不然,Lua执行循环体,直到条件为假。
local i = 1
whilea[i] do
print (a[i])
i = i + 1
end
7、repeat
repeat - until 语句重复执行循环体直到条件为真的时候结束,至少会执行一次
repeat
line = io.read()
until line ~= ""
print(line)
8、for 语句
for 语句在Lua中有两种形式:数字型for(Numeric for) 和 泛型for(generic for)
9、数字型for
var 从 exp1变化到 exp2,每次变化都以 exp3 为步进增长,每次增长都执行一次 执行体,exp3 是可选的,不写则步进为1
for var = exp1,exp2,exp3 do
<执行体>
end
for i=1,10 do print (i) end
--如果不想要设置上限的话,可以使用 math.huge
for i=1,math.huge do
print(i)
end
控制变量(比如上面的i)只在循环内部可见,一旦循环结束也就不存在了。
10、泛型for
泛型 for 循环通过一个迭代器(iterator)函数来遍历所有值:
for i,v in pairs(a) do print(v) end
非常经典的 key, value 形式,如果学习过其他的高级语言,一定不难以理解。
11、break 与 return
Break仍然是跳出当前的循环体,而return将会返回值后完全退出当前的块,return后的内容都不会得到执行。
1、在交互里面使用 local a = 1 接着输出 print(a) 为什么可能是nil?
答:因为交互模式里面,每次输入内容就有可能成为一个程序块,因此内容直接被垃圾回收掉了,一般可以通过人工的方式进行定义块。
do 回车后开始输入不同的命令,直到输入 end 才会停止作用域。
2、使用局部变量的好处?
答:①避免把无用的名称引入全局环境。 ②访问局部变量速度更快。 ③局部变量通常会随着作用域结束而消失,更好的垃圾回收。
3、在lua中经常见到这样的写法 local foo = foo ,作用是?
答:①创建局部变量foo并用全局变量进行初始化。②后续改变了全局foo,可以用来把值保存起来。③可以加速当前域中的访问。
4、在块中间进行变量声明是不是不如在开头部分声明习惯好?
答:正好相反,在需要的位置进行声明,可以让变量在声明的时候就有一个有意义的初始值(不会忘记去初始化),同时,缩短变量的作用域有助于提高代码的可读性。
5、在Lua中经常见到一大堆的if else 语句,为啥不用switch,是可读性差么?
答:不是,因为没有switch语句。
6、系统标准库中的迭代器有哪些呢?
答:①用于迭代文件中的每一行的 io.lines ②用于迭代table元素的 ipairs ③迭代字符串中单词的(string.gmatch) 等。
阅读(4347) | 评论(0) | 转发(0) |