1. 一个函数若只有一个参数,并且此参数是一个字面字符串或table构造式,那么圆括号便是可有可无的。如print "Hello World"
2. Lua为面向对象式的调用也提供了一种特殊的语法——冒号操作符。o.foo(o,x)的另一种写法是o:foo(x),冒号操作符使调用o.foo时将o隐含的作为函数的第一个参数。
3. 若实参多余形参,则舍弃多余的实参;若实参不足,则多余的形参初始化为nil。
4. Lua会调整一个函数的返回值数量以适应不同的调用情况。若将函数调用作为一条单独语句时,Lua会丢弃函数的所有返回值。若将函数作为表达式时,Lua会丢弃函数的所有返回值。若将函数作为表达式的一部分来调用时,Lua只保留函数的第一个返回值。只有当一个函数调用是一系列表达式的最后一个元素(或仅有一个元素)时,才能获得它的所有返回值。这里所谓的“一系列表达式”在Lua中表现为4种情况:多重赋值、函数调用时传入的实参列表、table的构造式和return语句。
5. 可以将一个函数调用放入一对圆括号中,从而迫使它只返回一个结果。
6. unpack函数接受一个数组作为参数,并从下标1开始返回数组的所有元素。
7. function add(...)参数表中的3个点(...)表示该函数可接受不同数量的实参。一个函数要访问它的变长参数时,仍需要用到3个点(...)。但不同的是,此时的3个点是作为一个表达式来使用的。function foo (...) local a, b, c = ... end。
8. 具有变长参数的函数同样可以拥有任意数量的固定参数,但固定参数必须放在变长参数之前。
9. 通常一个函数在遍历其变长参数时只需使用表达式{...},这就像访问一个table一样,访问所有的变长参数。然而在某些特殊的情况下,变长参数中可能包含一些故意传入的nil,那么此时就需要用函数select来访问变长参数了。调用select时,必须传入一个固定实参selector(选择开关)和一系列变长参数。如果selector为数字n,那么select返回它的第n个可变实参;否则,selector只能为字符串“#”,这样select会返回变长参数的总数,包括nil。
10. Lua5.0没有提供“...”表达式,而是通过一个隐含的局部table变量“arg”来接受所有的变长参数。这个table还有一个名为“n”的字段,用来记录变长参数的总数。
网友评论