Lua中文教程学习笔记 (4) 函数

 Lua中文教程学习笔记 (4)  函数

函数有两种用途:

1.完成指定的任务,这种情况下函数作为调用语句使用;
2.计算并返回值,这种情况下函数作为赋值语句的表达式使用
语法:
function func_name (arguments-list)
statements-list;
end;


当函数只有一个参数并且这个参数是字符串或者表构造的时候,()是可选的:
print "Hello World" <-->  print("Hello World")
dofile 'a.lua'  <-->  dofile ('a.lua')
print [[a multi-line <-->  print([[a multi-line
message]] message]])
f{x=10, y=20} <-->  f({x=10, y=20})
type{} <-->  type({})

Lua 函数实参和形参的匹配与赋值语句类似,多余部分被忽略,缺少部分用 nil 补足。
function f(a, b) return a or b end
CALL  PARAMETERS
f(3)  a=3, b=nil
f(3, 4)  a=3, b=4
f(3, 4, 5) a=3, b=4  (5 is discarded)


多个返回值

Lua 函数可以返回多个结果值,比如 string.find,其返回匹配串 “开始和结束的下标”(如果不存在匹配串返回 nil)
Lua 总是调整函数返回值的个数去适用调用环境,当作为一个语句调用函数时,所有返回值被忽略。假设有如下三个函数:
function foo0 () end -- returns no results
function foo1 () return 'a' end -- returns 1 result
function foo2 () return 'a','b' end  -- returns 2 results

第一,当作为表达式调用函数时

x,y = foo2() -- x='a', y='b'
x = foo2() -- x='a', 'b' is discarded
x,y,z = 10,foo2() -- x=10, y='a', z='b'
x,y = foo0() -- x=nil, y=nil
x,y = foo1() -- x='a', y=nil
x,y,z = foo2()  -- x='a', y='b', z=nil


第二,函数调用作为函数参数被调用时,和多值赋值是相同

print(foo0()) -->
print(foo1()) --> a
print(foo2()) --> a b
print(foo2(), 1) --> a 1
print(foo2() .. "x") --> ax


第三,函数调用在表构造函数中初始化时,和多值赋值时相同

a = {foo0()} -- a = {} (an empty table)
a = {foo1()} -- a = {'a'}
a = {foo2()} -- a = {'a', 'b'}
a = {foo0(), foo2(), 4} -- a[1] = nil, a[2] = 'a', a[3] = 4


return f()这种类型的返回 f()返回的所有值

function foo (i)
if i == 0 then return foo0()
elseif i == 1 then return foo1()
elseif i == 2 then return foo2()
end
end
print(foo(1)) --> a
print(foo(2)) --> a b
print(foo(0)) -- (no results)
print(foo(3)) -- (no results)

可以使用圆括号强制使调用返回一个值

print((foo0()))  --> nil
print((foo1()))  --> a
print((foo2()))  --> a

一个 return 语句如果使用圆括号将返回值括起来也将导致返回一个值

unpack

函数多值返回的特殊函数 unpack,接受一个数组作为输入参数,返回数组的所有元素

可变参数

Lua 函数可以接受可变数目的参数,和 C 语言类似在函数参数列表中使用三点(...)表示函数有可变的参数。Lua 将函数的参数放在一个叫 arg 的表中,除了参数以外,arg
表中还有一个域 n 表示参数的个数


printResult = ""
function print(...)
for i,v in ipairs(arg) do
printResult = printResult .. tostring(v) .. "\t"
end
printResult = printResult .. "\n"
end

有时候我们可能需要几个固定参数加上可变参数
function g (a, b, ...) end
CALL  PARAMETERS
g(3)  a=3, b=nil, arg={n=0}
g(3, 4)  a=3, b=4, arg={n=0}
g(3, 4, 5, 8) a=3, b=4, arg={5, 8; n=2}


命名参数


Lua 的函数参数是和位置相关的,调用时实参会按顺序依次传给形参。有时候用名字指定参数是很有用的,比如 rename 函数用来给一个文件重命名

示例
--先定义一个输出宽高的函数
local function logRectInfo(w,h)
    print("w = ".. w)
    print("h =  "..h)
end
--为了传错我们定义一个新的函数
local renamelogRectInfo(rect)
     return logRectInfo(rect.w,rect.h)
end
--测试
rect1 = {w = 11, h = 22}
rect2 = {h = 11, w = 22}


renamelogRectInfo(rect1)   --> w = 11  h = 22
renamelogRectInfo(rect2)   --> w = 22  h = 11






你可能感兴趣的:(Lua)