感觉学习语言的话,函数是个重头戏。来看一下Lua的函数是神马样纸的东东!
--一个简单的函数:阶乘 function factorial(num) if num == 0 then return 1 else return num * factorial(num - 1) end end恩,这就是个函数。function关键字,说明这是个函数,然后是函数名,后面跟的是参数列表,使用括号括起来。函数的结尾需要一个end关键字,表明函数结束了。
--一个简单的函数:阶乘
function factorial(num)
if num == 0 then
return 1
else
return num * factorial(num - 1)
end
end
--调用函数的例子:输入一个数字,求其阶乘
line = io.read()
n = tonumber(line)
if n == nil then
print("input is not a valid num")
else
print(factorial(n))
end结果:--函数后面只有一个参数,且为字符串
print "hello world"
--函数后面只有一个参数,且为table构造式
print {x = 10, y = 20}结果:function myprint(a, b, c) print(a, b, c) end --正常调用 myprint(1, 2, 3) --参数多了 myprint(1, 2, 3, 4) --参数不足 myprint(1, 2)结果:
--赶脚灰常牛的特性,多个返回值
--一个接受一个table的函数,返回最大元素以及该元素的位置
function maxinum(a)
local index = 1
local max = a[index]
for i, val in ipairs(a) do
if val > max then
max = val
index = i
end
end
return max, index
end
--测试
a = {1, 2, 3, 10, 4, 8, 5, 7}
print(maxinum(a))
结果:--多重返回值demo function func() return 1, 2, 3 end --正常的多重赋值,按照顺序进行多重赋值,返回值个数多了的舍去,少了的取nil a , b, c = func() print(a, b, c) --若函数是多重赋值的最后一个或者唯一一个表达式,那么会尽可能的保留其返回值 a, b, c = 0, func() print(a, b, c) --若函数不是最后一个的话,则只产生一个返回值 a, b, c = func(), 0 print(a, b, c)结果:
--多重返回值demo function func() return 1, 2, 3 end --接受固定参数的myprint() function myprint(a, b, c) print(a, b, c) end --当仅有或者为最后一个形参时,会尽可能保留其返回值 print(func()) --myprint仅接受三个参数 myprint(0, func()) --函数表达式为不为最后一个时,仅保留一个返回值 print(func(), 1)结果:
--多重返回值demo function func() return 1, 2, 3 end --当有()括起函数时,即形成了一个表达式,不管函数返回几个值,仅取一个值 print((func()))结果:
--多重返回值demo
function func()
return 1, 2, 3
end
--打印table中所有值的函数
function myprint(a)
for i, v in ipairs(a) do
print(v)
end
print("--------------------------------")
end
--当仅有一个或者是最后一个构造实参时
a = {func()}
myprint(a)
a = {0, func()}
myprint(a)
--当不是最后一个时,仅能返回一个值
a = {func(), 0}
myprint(a)结果:--多重返回值demo function func() return 1, 2, 3 end --return多个结果 function func2() return 1,func() end function func3() return func(),1 end --func2调用func1,func1在最后会返回1,2,3 print(func2()) --func3调用func1,func1不在最后,仅返回1 print(func3())
--变长参数
--...表示变长参数,使用for循环遍历其中的内容
function add(...)
local sum = 0
for i, v in ipairs{...} do
sum = sum + v
end
return sum
end
--使用函数
print(add(1, 2, 3, 4, 5))
结果:--变长参数
--func
function func(...)
--直接打印这些参数
print(...)
--赋值(多了的舍去,少了的nil)
a, b = ...
print("a, b = ", a, b)
--使用(...)表示只取得第一个
return (...)
end
print(func(1,2,3))
结果:--关于可变参数的另一种遍历方式
function func(...)
for i = 1, select('#', ...) do
local arg = select(i, ...)
print(arg)
end
end
func(1, 2, 3, 4)结果:--参数使用一个table的构造式,根据其中不同的字段获取其值
function Window(option)
--这里将参数的各个字段打印一遍
print(option.x or 0)--后面的为默认值,如果option.x为nil,则使用默认值
print(option.y or 0)
print(option.width or 800)
print(option.height or 600)
print("-------------------------------------------")
end
--当参数只有一个table的构造式时,可以省略括号
Window{x = 100, y = 200, width = 1000, height = 800}
--当有参数没给出时,会使用默认参数
Window{x = 100}
--顺序不一样也是可以的哈
Window{y = 100, width = 1000, x = 100, height = 800}结果:
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/puppet_master/article/details/47955819