【Lua】【4】Lua之——高级函数和控制结构

时间:2022-09-08 18:30:27
【4】Lua之——高级函数和控制结构  

【1】多值返回
【2】将十六进制转换成RGB
【3】指定多个值
【4】返回值丢失
【5】WoW中的多个返回值
【6】接收可变数目的参数
【7】声明变参函数
【8】结合select() 函数使用。。。
【9】泛型for 循环和迭代器
【10】泛型for语句的语法
【11】遍历表的数组部分
【12】遍历完整的表
【13】表的清除
【14】其他的迭代器
【15】对表的数组排序
【16】定义样例数据
【17】默认的排序顺序
【18】创建比较函数
【19】创建更复杂的比较函数
//============================================================

【1】多值返回

在Lua中,return 语句能够返回多个值。这些值能够让我们更轻松的完成一些工作。 

例如:在WOW中,颜色用十六进制(例如 99CCFF)和红,绿,蓝的百分比例(如 0.6,0.8,1.0)表示的。因此,很有必要将十六进制字符串转化成  红,绿,蓝三色组成值。

【2】将十六进制转换成RGB

函数string.sub() 能将串分解成3个颜色串,
而且 tonumber() 能将串转换成数值。

如果调用tonumber() 函数时,红色部分的值是  “FF”,则他的返回值是没有意义的。

【Lua】【4】Lua之——高级函数和控制结构       【Lua】【4】Lua之——高级函数和控制结构


因为输出数值介于 0.0 ~ 1.0 之间,所以需要将结果除以 255 得到百分比 。

【Lua】【4】Lua之——高级函数和控制结构     【Lua】【4】Lua之——高级函数和控制结构

【3】指定多个值

    为了得到具有多个返回值的函数,可以使用下面的一些语法:

var1 ,  var2 , var3 ,var4  =foride()

该语句调用 foride() .将第一个返回值分配给var1,  第二个的分配给var2  ,以此类推,如果返回值多余变量值,则他的返回值将被忽略。

【4】返回值丢失


【注意】当函数调用所得的多个返回值是另一个函数的最后一个参数,或者多指派表达式中的最后一个参数时,所以的返回值将被传入或使用。否则,只有第一个返回值被使用或指定
【Lua】【4】Lua之——高级函数和控制结构 


【Lua】【4】Lua之——高级函数和控制结构



作为最后一个参数
在处理多返回值时,可以总是将函数调用包含在小括号里,以限制它只有一个返回值

【Lua】【4】Lua之——高级函数和控制结构    【Lua】【4】Lua之——高级函数和控制结构


【5】WoW中的多个返回值

(1)哑变量   (2)select()语句

select() 函数允许你从给定的列表中选取一个特定的参数。这个参数接受任意数目的参数,其中第一个参数决定函数的行为。
当第一个参数,为 “#” 字符时,select 简单返回剩余参数的数目。
当第一次参数为一个数字,则select ()返回剩余参数中位于这个位置的参数,以及其后的所有参数。

如果仅需要从列表中得到一个值,可以直接将其分配给变量,或者把select()的调用括在小括号里,这样多余的值就会被舍弃。

]

【Lua】【4】Lua之——高级函数和控制结构

【Lua】【4】Lua之——高级函数和控制结构



【6】接收可变数目的参数

【7】声明变参函数

(1)带有可变参数的函数简称变参函数。它在函数声明中使用省略号来表明,其能包含任意数目的参数。

在Lua中,省略号可以作为函数声明的最后一个参数。一旦省略号在函数体中使用,在变参空位中提供的参数就会替代它。以print() 为例,它可以接受任意数目的参数,还可以在下面的函数定义中扩展。

【Lua】【4】Lua之——高级函数和控制结构

【Lua】【4】Lua之——高级函数和控制结构

(2)当函数运行时,Lua 遇到 " ..." 标示符,它用传入函数的参数列表代替该标示符。 因此,它可以以下面的形式使用:

---------------将参数传入另一个函数
    print( ... )
--------------- 给变量指派参数
    local  var1, var2 ,var3 = ... 
----------------用参数创建表
    local   tb1= { ... }

(3) 之前的例子可用来创建一个名为new_table() 的新函数 ,它有一个参数集,并利用表中数组部分的参数创建一个新表


【Lua】【4】Lua之——高级函数和控制结构

【Lua】【4】Lua之——高级函数和控制结构

【8】结合select() 函数使用。。。


(1)选择函数可以使变参函数使用非常容易,因为前者能提供传入参数的个数,同时,允许在不为它们分配变量的情况下对它们进行遍历。

这种方法可以避免每次都需要创建一个新的表,而且还允许nil 作为一个参数传入。
【Lua】【4】Lua之——高级函数和控制结构

【Lua】【4】Lua之——高级函数和控制结构

(2)
【Lua】【4】Lua之——高级函数和控制结构


【Lua】【4】Lua之——高级函数和控制结构

【9】泛型for 循环和迭代器

        到目前为止,还不能对散列表里的元素进行循环,但是Lua 提供了一个for语句的通用形式,其与一个迭代器函数结合使用,可以实现上述功能。

        *将迭代器定义为:允许程序在不考虑数据集合的内部实现的情况下对这个集合进行遍历的对象。
    在Lua里,我们可以使用迭代器函数与一些额外的信息在集合里进行遍历。 


【10】泛型for语句的语法
    泛型for 循环的语法与数值for 循环有一点儿不同。

    for  val1 ,val2 ,val3 ,...   in  <expression>  do

    end

    泛型的for 循环可以在每次循环中返回多个变量(实际上与迭代器所定义的数目一样多)。紧随着for关键字,可以提供由迭代器函数所指定的一系列变量名。循环通过计算<exproession> 的值来决定遍历的行为。<expression> 应当返回下面3个值:
    一个在每次循环中都可以被调用的迭代器函数
    一个状态值,在下次调用时都被迭代器函数所使用
    一个初始值,用来初始化迭代器、
    
    幸运的是,除非要编写自己的迭代器函数,否则不需要直接处理这些值。许多已经编写好的函数可以为你创建迭代器。

【11】遍历表的数组部分    ( ipairs )

ipairs() 允许在不使用数值for 循环的情况下遍历一个表的数组部分。  一些编程人员倾向于使用  ipair() 而不是数值 for循环。

【Lua】【4】Lua之——高级函数和控制结构 

ipairs()函数接受一个表作为输入,返回遍历一个表的数组部分 所需的所有信息,包括迭代器函数本身。 (数组部分)
【Lua】【4】Lua之——高级函数和控制结构


【12】遍历完整的表

 另一个函数 , pairs()允许你完整的遍历一个表, 包括表的数组部分和散列表部分。
使用方法和ipairs() 一样: 将表传入其中,并作为范型for循环 的一部分 来使用即可。
 

【Lua】【4】Lua之——高级函数和控制结构    【Lua】【4】Lua之——高级函数和控制结构

【注意】如果需要顺序的遍历表中的数值元素,就必须使用ipairs() 函数,ipairs() 可以保证顺序遍历。

pairs() 函数的非顺序遍历由散列表的实现方式带来:一个关联键/ 值对的集合,没有内部顺序。


【13】表的清除
可以在遍历的过程里通过使用 pairs() 函数清除整个表。

    【Lua】【4】Lua之——高级函数和控制结构

因为pairs() 对于整个表的键都有作用,所以这是一个清除所以元素的捷径 (如果你需要重新使用一个表)


【14】其他的迭代器

        Lua里的许多其他函数都可以产生迭代器, 这些迭代器也是非常有用的。 string.gmatch()  函数可以通过Lua模式匹配产生一个匹配string的迭代器。下一章将更多的学习关于这个函数和Lua模式匹配的信息。

【Lua】【4】Lua之——高级函数和控制结构


【Lua】【4】Lua之——高级函数和控制结构


【15】对表的数组排序

            表结构内置的 table.sort()  函数只能以默认的方式 对数字和字符串数据进行排序。  不过,table.sort()  函数也允许 传函数, 并且依据函数的返回值来确定整个排序方式。这就意味着你可以编写自己的函数,用来在排序时决定两个表中的哪一个更大。


【Lua】【4】Lua之——高级函数和控制结构    【Lua】【4】Lua之——高级函数和控制结构

JS 在Java 的前面那是因为   S>s,大写排在小写的前面。
A——Z,   a——z

【16】定义样例数据

在这个例子中需要定义一些简单的数据以进行排序。在编译器里写下如下程序。

【Lua】【4】Lua之——高级函数和控制结构


【17】默认的排序顺序

在默认情况下,列表的顺序与输入时一致,这是因为它使用的是表里的数组部分。

    【Lua】【4】Lua之——高级函数和控制结构 

    【Lua】【4】Lua之——高级函数和控制结构

【18】创建比较函数

如果你视图使用table.sort() 对数据进行比较,就会得到一个错误的信息,因为Lua并不知道怎样去比较表中的值

table .sort()  函数需要指定第二个参数来决定如何比较大小。第二个参数是一个比较函数,它需要两个参数。若第一个参数小于第二个参数,则返回真;若第一个参数大于第二个参数,则返回假。这意味着可以比较元素的数值部分,或者是其他 一些标准。

【Lua】【4】Lua之——高级函数和控制结构


【Lua】【4】Lua之——高级函数和控制结构




【19】创建更复杂的比较函数

假设你想编写一个先以角色的等级再以角色的名字来进行排序的函数。

【Lua】【4】Lua之——高级函数和控制结构


【Lua】【4】Lua之——高级函数和控制结构