我目前正在为Lightroom插件编写代码. Lightroom不使用5.2版.我有以下功能,目前工作正常,但我担心好像Lightroom升级到更新的版本,此代码将中断.在这种情况下,您是否有以独立于lua版本的方式
以下代码检查函数F是否用作表needsModule中的键.如果是这样,它组成一个函数,包括调用将模块更改为键F指向的值,然后调用函数F及其参数.
local function wrapFOM(F,...) local openModule = needsModule[F] if openModule == nil then return function() return F(unpack(arg)) end end return function() if LrApplicationView.getCurrentModuleName() ~= openModule then LrApplicationView.switchToModule(openModule) end return F(unpack(arg)) --proper tail call end endLua 5.1及以上支持vararg处理的新风格:
function vfunc( ... ) for i = 1, select( '#', ... ) print( i, (select( i, ... )) ) end end
或者如果你真的想在新分配的表中每个函数调用varargs(小心nil参数):
function vfunc( ... ) local args = {...} for i, v in ipairs( args ) do print( i, v ) end end
如果你还需要支持Lua 5.0,那你就不走运了,因为…在参数列表之外是语法错误.你不得不求助于条件代码生成来规避:
-- newer Lua versions use load instead of loadstring local loadstring = loadstring or load -- feature test for Lua 5.1+ local supports_ellipsis = loadstring( "return ..." ) ~= nil local args = supports_ellipsis and "{...}" or "arg" function vararg( n, f ) local t = {} for i = 1, n do t[ i ] = "_"..i end local params = table.concat( t, ", ", 1, n ) local code = [[ return function( f ) return function( ]]..params..[[, ... ) return f( ]]..params..", "..args..[[ ) end end ]] return assert( loadstring( code, "=(vararg)" ) )()( f ) end
像这样使用它:
-- two fixed parameters, third parameter holds vararg list local vfunc = vararg( 2, function( a, b, arg ) print( a, b ) for i,v in ipairs( arg ) do print( "", i, v ) end end ) vfunc( "a" ) vfunc( "a", "b" ) vfunc( "a", "b", "c" ) vfunc( "a", "b", "c", "d" )
上面的vararg函数的接口甚至可以用于早期版本的Lua,但是你可能需要在单独的文件中单独实现,因为语言差异太大.