闲扯LUA之二

来源:互联网 发布:php格式怎么转换 编辑:程序博客网 时间:2024/05/17 02:20


053当函数只有一个参数且这个参数是字符串或表构造的时候,用于表明是函数调用的()可以省略。例如:print("Hello world")   <-->   print "Hello world",type({1, 2, 3})   <--> type{1, 2, 3}。

·054Lua提供了面向对象方式调用函数的语法:o:fun(x)   <-->   o.fun(o, x)

·055Lua调用的函数可以是用其它语言编写的。

·056Lua函数的实参与形参与赋值语句类似,多余的部分被忽略,不足的部分用nil补充。

·057Lua函数可以返回多个值。例如:function size() return 100, 200 end。x = size(),则多余的200被丢弃。x, y, z = size(),则z被赋值为nil。如果print((size())),则size()被强制只返回一个值。

·058函数多值返回的特殊函数是unpack,它接受一个数组作为输入参数,返回数组中的所有元素。例如:a = {"hello", "world"} print(unpack(a)) 输出:hello world

·059Lua函数可以接受可变数目的参数,可变函数的参数列表使用...表示。接受到的参数被放在一个叫arg的表中,该表中还有一个名为n的域表示参数的个数。还可以在可变参数前加上固定参数(在C语言中要求可变函数必须包含固定参数,而Lua中固定部分是可选的)。

·060对于返回多值的函数,可以使用哑元(用下划线表示)跳过不需要的值。例如:函数fun返回1,2,3。如果只需要3,则:_, _, x = fun()

·061Lua的函数参数是和位置相关的,因此调用时实参会按顺序传递给形参。当参数比较多的时候,用名字指定参数的做法会更加有效。例如:

function window(option)

     if option.size ~= "max" then

          print("min")

     elseif option.name ~= "min" then

          print("name error")

     end

end

调用示例:window{size = "max", name = "min"}   <--> window{name = "min", size = "max"}。注意这里使用{}而不是()


·062Lua中的函数是第一类值,即与数字、字符串一样可以被存储在变量或表中,可以作为函数的参数或返回值。例如:
     p = print           --类似于函数指针
     p("Hello world")   <-->   print("Hello world")

·063Lua中的函数可以嵌套(C没有这种能力,Pascal可以),并且嵌套的函数可以访问外部函数中的变量。

·064Lua中的函数可以没有名字,即匿名函数


·065在Lua中我们常这样书写函数:

function fun(x)

     return 2 * x

end

实际上这是Lua语法的特例,原本的形式如下:

fun = function(x)

     return 2 * x

end

函数的定义实际上是一个赋值语句,将类型为function的变量赋值给一个变量(类似C中将一个函数地址(使用函数名表示)赋值给一个函数指针)。

·066table标准库提供的sort排序函数接受一个表作为输入参数并且排序表中的元素。Lua采用给此函数提供一个函数变量的方式描述排序的依据(有点像C中的回调函数),而不是传入尽可能多的提供参数来描述。像sort这种接受其它函数作为参数的的函数在Lua中被称作高级函数(与普通函数没有什么本质上的区别,只是接受函数作为参数)。sort使用示例:

per = {{name = "abc", money = 1000, happy = 100}, {name = "bac", money = 999, happy = 101}, {name = "cab", money = 1999, happy = 60}}

comfun = function(x, y) 
     return x.name > y.name 
end

table.sort(per, comfun)

for _, e in ipairs(per) print(e.name, e.money, e.happy)




comfun = function(x, y) 
     return x.money > y.money 
end

table.sort(per, comfun)

for _, e in ipairs(per) print(e.name, e.money, e.happy)



·067当一个函数的内部嵌套另一个函数定义时,内部的函数可以访问外部函数的变量,这种特征在Lua中被称作词法定界。嵌套函数内出现的外部变量被称作外部的局部变量(或者叫upvalue)。

·068闭包是一个函数(内嵌于其它函数)和它的upvalue(外部函数的局部变量)。例如:

function counter()

     local i = 0

     return function() --匿名函数

          i = i + 1

          return i

     end

end

c1 = counter() --注意这里是counter()而不是counter,counter()调用counter函数 --得到内嵌匿名函数的地址。

print(c1()) --得到1

print(c1()) --得到2

print(c1()) --得到3

c2 = counter() --创建一个新局部变量i,得到一个新的作用在此变量上的闭包。

print(c2()) --得到1


·069技术上说,闭包指值(函数指针值)而不是函数,函数只是闭包的原型声明(貌似不好理解,thinking中......)。




0 0
原创粉丝点击