1 函数定义中的变量默认为全局变量
与python不同,要想让函数定义中出现的变量为局部变量,需要声明为local。
2 可变参数函数中的一些语法糖
```Lua
function average(...)
result = 0
local arg={...}
for i,v in ipairs(arg) do
result = result + v
end
print("总共传入 " .. #arg .. " 个数")
return result/#arg
end
print("平均值为",average(10,5,3,4,5,6))
```
以上代码执行结果为:
总共传入 6 个数
平均值为 5.5
以上:
1. Lua将函数的参数放在一个叫arg的表中,#arg 表示传入参数的个数;
2. ipair函数可以将arg分解开来,每个元素都是{键,值};
3. `...`可以作为变量一样使用,加上`{...}`就成为表。
如果不使用#arg变量,用普通的写法,就需要写成如下:
```Lua
function average(...)
result = 0
local arg={...}
local s=0
for i,v in ipairs(arg) do
result = result + v
s=i
end
print("总共传入 " .. s .. " 个数")
return result/s
end
print("平均值为",average(10,5,3,4,5,6))
```
其中,s用来接收键,最后一个键就是arg中的元素个数(正好Lua的下标是从1开始的)。
3 比较强调泛型for的作用
```lua
for xx in fun(t)
do
...
...
end
```
上面这个函数“fun”是一个迭代器,在Lua语言中,通常使用“pair”和“ipair”这两个函数,函数的参数通常是一个列表“{XXX}”,例如实例:
```Lua
function fun(table)
for i,v in pairs(table)
do
print('key:'..i..'~'..'value:'..v)
end
end
t={1,2,3,4,5,'a'}
fun(t)
```
上面这样的案例总感觉不能体现“泛型”本质,泛型本质应该是“泛化的类型”,这种编程范式可以使得类的详细定义向后推至实例化时,从而很好地提高类的复用性。上面的例子肯定时不能体现出这种本质的。但是,如果把这个for结构中的“pair(t)”看作可以替换的整体,就可以把它写作自定义用途的“迭代器”,实例:
```Lua
function iterator(table)
local i=0
return
function()
i=i+1
return table[i]
end
end
for v in iterator({1,2,3,4,5,'a'}) do
print(v)
end
```
回头来看,如果不使用上述范式,而使用原始的编程思想实现,则需要:
```Lua
t={1,2,3,4,5,'a'}
i=1
repeat
print(t[i])
i=i+1
until(i>6)
```
但是,“until”中的6该如何得到呢,如果列表是可变长度的呢?这种结构就不适用了,所以这也许就是泛型for的意义之一吧!