Lua 函数的缺省参数和可变参数列表
Lua 里面的函数有个“奇怪的”特性——调用时参数个数可以传任意多个。比方说有个函数的定义是 function Foo( a, b ),那么你调用的时候可以写 Foo( “2ndboy”, “test” ),也可以写 Foo( 123 ),还可以写 Foo( 123, 987, “2ndboy” ),都不算错。如果实参个数少于形参个数,那么其余参数的值就是 nil;反之如果多于形参个数,那么多出来的值就被抛弃了。
想到利用这个特性可以模拟一下缺省参数,Lua 是没有内建对缺省参数的支持的(比如 C++ 里面的 int Foo( int a, int b = 999 ))。如果发现某个参数为 nil,那么就给它赋一个缺省值:
- function Foo( a, b )
- if nil == b then
- b = 999
- end
- Bar( a, b )
- end
不过这不是一个好的实现,因为函数的用户也许真的想传一个 nil 过来:)
Lua 有内建对可变参数列表的支持,语法跟 C/C++ 一样,同样是三个英文句点:function Foo( a, … )。在函数内部,Lua 会且仅会把可变参数部分放在一个叫 arg 的表里面,你可以通过 arg.n 得到可变部分的参数的个数。对于我刚才举的这个例子,如果用 Foo( 666, 999 ) 来调用,则 arg.n == 1,用 arg[1] 可以取到 999 这个值。所以我想,用可变参数列表来模拟缺省参数也许是个更好的主意:
- function Foo( a, ... )
- if 1 == arg.n then
- Bar( a, arg[1] )
- else
- Bar( a, 999 )
- end
- end
—–
我现在在用的语法着色插件 CoolCode 还不支持 Lua,试了一下发现把 Lua 代码当作 Ruby 来渲染效果也不错,在官方还未支持之前,先这么用着。


一月 14th, 2010 at 16:22
如何压入多个函数呢??
lua_pushcfunction(lua, Msg);
lua_pushcfunction(lua, Msg1);
lua_setglobal(lua, “Msg”);
lua_setglobal(lua, “Msg1″);
这样好象不行,每次都是 Msg1这个函数被调用,但我的脚本里面是先调用 Msg
一月 19th, 2010 at 22:10
不好意思,不碰 Lua 久已,我得再去翻翻资料才能回答这个问题:)