首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Lua的早期版本中使用varargs,但希望与5.2+兼容

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

Stack Overflow用户
提问于 2015-12-19 23:25:32
回答 2查看 529关注 0票数 6

我目前正在为一个Lightroom插件编写代码。Lightroom不使用5.2版本。我有以下功能,它目前工作良好,但我担心如果Lightroom确实升级到一个更新的版本,这段代码就会中断。在这种情况下,您是否建议以不依赖lua版本的方式提供varargs处理?

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

代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-20 15:10:04

Lua5.1和up支持vararg处理的新风格:

代码语言:javascript
运行
复制
function vfunc( ... )
  for i = 1, select( '#', ... ) do
    print( i, (select( i, ... )) )
  end
end

或者,如果您真的希望在新分配的表中使用varargs,那么每个函数调用(注意nil参数):

代码语言:javascript
运行
复制
function vfunc( ... )
  local args = {...}
  for i, v in ipairs( args ) do
    print( i, v )
  end
end

如果您还需要支持Lua5.0,那么您就倒霉了,因为参数列表之外的...是语法错误。您将不得不求助于条件代码生成来避免这样的情况:

代码语言:javascript
运行
复制
-- 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

像这样使用它:

代码语言:javascript
运行
复制
-- 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,但是您可能需要在单独的文件中单独实现,因为语言差别太大了。

票数 4
EN

Stack Overflow用户

发布于 2015-12-20 03:47:52

根据https://www.adobe.com/content/dam/Adobe/en/devnet/photoshoplightroom/pdfs/lr4/lightroom-sdk-guide.pdf

Lightroom 4使用Lua语言的5.1.4版本。

由于Lua5.1支持旧风格和新风格的varargs,我认为您可以使用新的风格,而不必担心向前兼容性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34376466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档