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,那么就给它赋一个缺省值:

  1. function Foo( a, b )
  2.      if nil == b then
  3.          b = 999
  4.      end
  5.      Bar( a, b )
  6.  end

不过这不是一个好的实现,因为函数的用户也许真的想传一个 nil 过来:)

  Lua 有内建对可变参数列表的支持,语法跟 C/C++ 一样,同样是三个英文句点:function Foo( a, … )。在函数内部,Lua 会且仅会把可变参数部分放在一个叫 arg 的表里面,你可以通过 arg.n 得到可变部分的参数的个数。对于我刚才举的这个例子,如果用 Foo( 666, 999 ) 来调用,则 arg.n == 1,用 arg[1] 可以取到 999 这个值。所以我想,用可变参数列表来模拟缺省参数也许是个更好的主意:

  1. function Foo( a, ... )
  2.      if 1 == arg.n then
  3.          Bar( a, arg[1] )
  4.      else
  5.          Bar( a, 999 )
  6.      end
  7.  end

—–

我现在在用的语法着色插件 CoolCode 还不支持 Lua,试了一下发现把 Lua 代码当作 Ruby 来渲染效果也不错,在官方还未支持之前,先这么用着。

2 Responses to “Lua 函数的缺省参数和可变参数列表”

  1. jackwang Says:

    如何压入多个函数呢??

    lua_pushcfunction(lua, Msg);
    lua_pushcfunction(lua, Msg1);

    lua_setglobal(lua, “Msg”);
    lua_setglobal(lua, “Msg1”);

    这样好象不行,每次都是 Msg1这个函数被调用,但我的脚本里面是先调用 Msg

  2. 2ndboy Says:

    不好意思,不碰 Lua 久已,我得再去翻翻资料才能回答这个问题:)

Leave a Reply