当函数只有一个参数的时候,且这个参数是字符串或者是表构造的时候。调用形式可以如下:
print"hello word" type{}
函数的形参和实参匹配的时候,和多值赋值是一样的,实参多余的部分会舍弃,少的部分会用nil填上
多值返回 :
function foo2 ()
return 4,5
end
当函数被独立调用的时候(类似:foo2()),它的返回值将被忽略。
当函数作为表达式被掉用的时候有两种情况:
1、函数作为这个表达表达式的唯一参数,或者时最后一个参数,它会尽可能多的返回值。
PS:
x=foo2() ==> x = 4
x,y=foo2() ==> x=4,y=5
x,y,z = foo2() ==> x=4,y=5,z=nil
print (10,foo2()) ==> 10,4,5
2、其他情况下,foo2只返回第一个值
PS:print(foo2(),10) ==> 4,10
function foo(i)
if i==1 then return foo1()
elseif i==2 then return foo2()
elseif i==3 then return foo3()
end
end
像上述这种情况,foo*是在另一个函数的return语句中的。
如果单纯的调用foo(i),那么foo*()是返回所有的值的。
如果是(foo(i)),这么调用,那么foo*()只返回第一个值。
如果在return语句之后加括号,例如 return(foo2()),也会导致foo2()只返回第一个值。
可变参数 :
在函数的形参中可以通过 ... 来表示一个函数还拥有其他未知的参数。
PS :test(x,...)
在调用test的时候,会把第一个实参放到x中,剩下的实参会放到test 的arg表中,arg表还包含一个recod 记录具体实参的个数。
PS: test (10,9,8) x=10, arg={9,8,n=2}
可以通过操作arg表来把函数的实参读取出来,给其他函数用。
(ps:这个例子我在虚拟机上没有尝试成功,需要之后回头再看)
找到原因了,在lua5.2版本里,已经取消了这个默认的arg表,如果要使用可变部分的参数,需要显式的声明一个表去接受,例如:
function test(...)
arg = {...}
...
end
命名参数 :
因为lua是可以将表作为函数的参数的,所以可以通过表的索引来指定表中的某个元素的值。
PS:假设test是可变参数,且有具体实现
function test(arg)
return test(arg.one,arg.two)
end
这个时候调用test,它的参数就可以用以下方式填写
test{”one“=big,“two”=small}
这种方法的好处在于,不需要记住参数的位置,且每个元素有个性化的索引,非常直观的知道哪个参数,需要带入什么值。