[转帖]lua-book-控制语句

lua,book,控制,语句 · 浏览次数 : 0

正文

http://me.52fhy.com/lua-book/chapter4.html

 


Lua 语言提供的控制结构有 if-elsewhilerepeatfor,并提供 breakreturn 关键字来满足更丰富的需求。不支持switchcontinue

Lua 提供的控制语句部分特征类似Shell和Python:

  • 语句都以end结束
  • if后面都有then
  • 没有花括号{}
  • 循环结构whilefor表达式后面都有关键字do; python里是用的:

if-else

单个 if 分支 型:

a = 10
if a > 0 then
	print(a)
end

两个分支 if-else 型:

a = 10
b = 11
if a > b then
	print(a)
else
	print(b)
end

多个分支 if-elseif-else 型:

a = 10
b = 11
if a > b then
	print(a)
elseif a < b then
	print(b)
else
	print(a)
end

与 C 语言的不同之处是 else 与 if 是连在一起的,若将 else 与 if 写成 else if 则相当于在else 里嵌套另一个 if语句。

while

Lua 跟其他常见语言一样,提供了 while 控制结构,语法上也没有什么特别的。但是没有提供 do-while 型的控制结构,但是提供了功能相当的 repeat

sum = 0
i = 0
while i<=100 do
	sum = sum + i
	i = i + 1;
end
print(sum) -- 5050

注意:Lua 并没有像许多其他语言那样提供类似 continue 这样的控制语句用来跳过当前循环。

再看看 repeat 的用法:

sum = 0
i = 0
repeat
	sum = sum + i
	i = i + 1;
until i>100
print(sum) -- 5050

for

for有两种结构:数字 for(numeric for) 和范型 for(generic for)。

数字 for 类似C语言的用法;范型 for 类似Python里的for...in用法。

for 数字型

数字型 for 的语法如下:

for var = begin, finish, step do
	--body
end

需要关注以下几点:

  • var 从 begin 变化到 finish,每次变化都以 step 作为步长递增 var
  • beginfinishstep 三个表达式只会在循环开始时执行一次
  • 第三个表达式 step是可选的,默认为 1
  • 控制变量 var 的作用域仅在 for 循环内,需要在外面控制,则需将值赋给一个新的变量
  • 循环过程中不要改变控制变量的值,那样会带来不可预知的影响

示例:

sum = 0
for i=0,100,1 do
	sum = sum + i
end
print(sum) -- 5050

for 泛型

Lua 编程语言中泛型for循环语法格式:

-- 打印数组a的所有值  
for i,v in ipairs(a) do 
	print(v) 
end  

i是数组索引值,v是对应索引的数组元素值。ipairsLua提供的一个迭代器函数,用来迭代数组。

示例:

days = {
	"Monday",
	"Tuesday",
	"Wednesday",
	"Thursday",
	"Friday",
}

for k,v in ipairs(days) do
	print(k,v)
end

输出:

1       Monday
2       Tuesday
3       Wednesday
4       Thursday
5       Friday

ipairs以及pairs 的不同: pairs可以遍历表中所有的key,并且除了迭代器本身以及遍历表本身还可以返回nil; 但是ipairs则不能返回nil,只能返回数字0,如果值遇到nil则直接跳出循环退出。

示例:

local tabFiles = {  
	[1] = "test1",  
	[6] = "test2",  
	[4] = "test3"  
}  

for k,v in ipairs(tabFiles) do
	print(k,v)
end

输出:

1       test1

ipairs遍历时,当key=2时候value就是nil,所以直接跳出循环。

如果换成pairs,则全部输出:

1       test1
6       test2
4       test3

值得一提的是,在 LuaJIT 2.1 中, ipairs() 内建函数是可以被 JIT 编译的,而 pairs() 则只能被解释执行。

break

语句 break 用来终止 while 、 repeat 和 for 三种循环的执行,并跳出当前循环体, 继续执行当前循环之后的语句。

return

return 主要用于从函数中返回结果,或者用于简单的结束一个函数的执行。

需要注意的是: return 只能写在语句块的最后,一旦执行了 return 语句,该语句之后的所有语句都不会再执行。

若要写在函数中间,则只能写在一个显式的语句块内,否则会报错:

function test1(x, y)
	return x+y;
	-- print(x+y)
	-- 后面的print如果不注释,会报错
end

function test2(x, y)
	if x > y then
		return x
	else
		return y
	end
	print("end") -- 此处的print不注释不会报错,因为return只出现在前面显式的语句块
end

function test3(x, y)
	print(x+y)
	do return end
	print(x) -- 此处的print不注释不会报错,因为return由do...end语句块包含。这一行语句永远不会执行到
end

test1(10,11)
test2(10,11)
test3(10,11)

所以,有时候为了调试方便,我们可以想在某个函数的中间提前 return ,以进行控制流的短路,此时我们可以将 return 放在一个 do...end 代码块中。

与[转帖]lua-book-控制语句相似的内容:

[转帖]lua-book-控制语句

http://me.52fhy.com/lua-book/chapter4.html Lua 语言提供的控制结构有 if-else,while,repeat,for,并提供 break、return 关键字来满足更丰富的需求。不支持switch、continue。 Lua 提供的控制语句部分特征类似

[转帖]lua-book

http://me.52fhy.com/lua-book/chapter2.html 数据类型 [TOC] @date: 2018-3-18 Lua中有8个基本类型分别为:nil、boolean、number、string、table、function、userdata、thread。 函数 typ

[转帖]lua-book-运算符

http://me.52fhy.com/lua-book/chapter3.html Lua支持下列主要的运算符: 算术运算符 关系运算符 逻辑运算符 赋值运算符 还支持..、#特殊运算符。其中赋值运算符仅支持=,不支持C语言的+=、++等运算符。 算术运算符 + 加法 - 减法或者负号 * 乘法

[转帖]lua-book-函数

http://me.52fhy.com/lua-book/chapter5.html 在 Lua 中,函数 也是一种数据类型,函数可以存储在变量中,可以通过参数传递给其他函数,还可以作为其他函数的返回值。 函数定义 函数定义格式: function function_name (arc) -- ar

[转帖]lua-book-模块

http://me.52fhy.com/lua-book/chapter6.html 模块 从Lua5.1开始,Lua添加了对模块和包的支持。 Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个table,然后把需要导出的常量、函数放入其中,最后返回这个

[转帖]lua-book-常用库介绍

http://me.52fhy.com/lua-book/chapter7.html String 库 .. 链接两个字符串 string.upper(argument) 字符串全部转为大写字母。 string.lower(argument) 字符串全部转为小写字母。 string.len(arg)

[转帖]lua-book-文件操作

http://me.52fhy.com/lua-book/chapter8.html Lua I/O 库用于读取和处理文件。分为简单模式、完全模式。 简单模式(simple model) 拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。 完全模式(complete model

[转帖]lua-book-元表

http://me.52fhy.com/lua-book/chapter9.html 在Lua5.1语言中,元表 (metatable) 的表现行为类似于 C++ 语言中的操作符重载,类似PHP的魔术方法。Python里也有元类(metaclass)一说。 通过元表,Lua有了更多的扩展特性。Lua

[转帖]Ngx_lua

http://me.52fhy.com/lua-book/chapter12.html 简介 ngx_lua 指的是 lua-nginx-module模块:通过将 LuaJIT 的虚拟机嵌入到 Nginx 的 worker 中,这样既保持高性能,又能不失去lua开发的简单特性。 OpenResty 

[转帖]Redis里使用Lua

http://me.52fhy.com/lua-book/chapter11.html 版本:自2.6.0起可用。 时间复杂度:取决于执行的脚本。 使用Lua脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。 原子操作。redis会将整个脚本作为一个整体执行,中间不会被