我目前正在为一个Lightroom插件编写代码。Lightroom不使用5.2版本。我有以下功能,它目前工作良好,但我担心如果Lightroom确实升级到一个更新的版本,这段代码就会中断。在这种情况下,您是否建议以不依赖lua版本的方式提供varargs处理?
下面的代码检查函数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
end
发布于 2015-12-20 15:10:04
Lua5.1和up支持vararg处理的新风格:
function vfunc( ... )
for i = 1, select( '#', ... ) do
print( i, (select( i, ... )) )
end
end
或者,如果您真的希望在新分配的表中使用varargs,那么每个函数调用(注意nil
参数):
function vfunc( ... )
local args = {...}
for i, v in ipairs( args ) do
print( i, v )
end
end
如果您还需要支持Lua5.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,但是您可能需要在单独的文件中单独实现,因为语言差别太大了。
发布于 2015-12-20 03:47:52
Lightroom 4使用Lua语言的5.1.4版本。
由于Lua5.1支持旧风格和新风格的varargs,我认为您可以使用新的风格,而不必担心向前兼容性。
https://stackoverflow.com/questions/34376466
复制相似问题