在早期版本的Lua中使用varargs,但希望与5.2兼容

前端之家收集整理的这篇文章主要介绍了在早期版本的Lua中使用varargs,但希望与5.2兼容前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我目前正在为Lightroom插件编写代码. Lightroom不使用5.2版.我有以下功能,目前工作正常,但我担心好像Lightroom升级到更新的版本,此代码将中断.在这种情况下,您是否有以独立于lua版本的方式提供varargs处理的建议?

以下代码检查函数F是否用作表needsModule中的键.如果是这样,它组成一个函数,包括调用将模块更改为键F指向的值,然后调用函数F及其参数.

  1. local function wrapFOM(F,...)
  2. local openModule = needsModule[F]
  3. if openModule == nil then
  4. return function() return F(unpack(arg)) end
  5. end
  6. return function()
  7. if LrApplicationView.getCurrentModuleName() ~= openModule then
  8. LrApplicationView.switchToModule(openModule)
  9. end
  10. return F(unpack(arg)) --proper tail call
  11. end
  12. end

解决方法

Lua 5.1及以上支持vararg处理的新风格:
  1. function vfunc( ... )
  2. for i = 1,select( '#',... )
  3. print( i,(select( i,... )) )
  4. end
  5. end

或者如果你真的想在新分配的表中每个函数调用varargs(小心nil参数):

  1. function vfunc( ... )
  2. local args = {...}
  3. for i,v in ipairs( args ) do
  4. print( i,v )
  5. end
  6. end

如果你还需要支持Lua 5.0,那你就不走运了,因为…在参数列表之外是语法错误.你不得不求助于条件代码生成来规避:

  1. -- newer Lua versions use load instead of loadstring
  2. local loadstring = loadstring or load
  3. -- feature test for Lua 5.1+
  4. local supports_ellipsis = loadstring( "return ..." ) ~= nil
  5. local args = supports_ellipsis and "{...}" or "arg"
  6.  
  7. function vararg( n,f )
  8. local t = {}
  9. for i = 1,n do t[ i ] = "_"..i end
  10. local params = table.concat( t,",1,n )
  11. local code = [[
  12. return function( f )
  13. return function( ]]..params..[[,... )
  14. return f( ]]..params..","..args..[[ )
  15. end
  16. end
  17. ]]
  18. return assert( loadstring( code,"=(vararg)" ) )()( f )
  19. end

像这样使用它:

  1. -- two fixed parameters,third parameter holds vararg list
  2. local vfunc = vararg( 2,function( a,b,arg )
  3. print( a,b )
  4. for i,v in ipairs( arg ) do
  5. print( "",i,v )
  6. end
  7. end )
  8.  
  9. vfunc( "a" )
  10. vfunc( "a","b" )
  11. vfunc( "a","b","c" )
  12. vfunc( "a","c","d" )

上面的vararg函数的接口甚至可以用于早期版本的Lua,但是你可能需要在单独的文件中单独实现,因为语言差异太大.

猜你在找的Lua相关文章