首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从lua表填充iup列表

从lua表填充iup列表
EN

Stack Overflow用户
提问于 2019-01-06 20:59:58
回答 1查看 179关注 0票数 0

我正在构建一组IUP对话框的'helper‘函数--我可以将其包含在我的Lua代码中,以便以一致的方式快速实现常用的接口功能。

我有一个函数可以通过回调来创建一个“标准”的iup列表:

代码语言:javascript
复制
function MakeList(funcSelect)
    return iup.list{
        valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", editbox = "NO",
        expand = "YES", visibleitems = "5"}
end

但是现在我想对它进行增强,以便有选择地用静态值的列表填充它,这样我就可以调用例如mylist = MakeList(myFunction, {"X", "B", "Q"}),其中函数规范是function MakeList(funcSelect, tblVals),并且如果值表被指定为(等效于),则返回填充的列表

代码语言:javascript
复制
iup.list{"X", "B", "Q";
        valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", editbox = "NO",
        expand = "YES", visibleitems = "5"}

但(最终)如果值表未指定或为空,则不会填充--这是问题的第二阶段。

该列表将在映射之前进行填充;我知道如何在使用myList.APPENDITEM进行映射之后执行此操作,但对于静态列表,这不应该是必需的(应该这样做吗?)

我试过了

代码语言:javascript
复制
function MakeStaticList(funcSelect, tblVals)
    return iup.list{table.unpack(tblVals);
        valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", 
        editbox = "NO", expand = "YES", visibleitems = "5"}
end

但是这会跳过这个行为:Lua unpack() messing arguments,所以只有表中的第一项被添加到列表中。

我也试过

代码语言:javascript
复制
function MakeStaticList(funcSelect, tblVals)
    l = iup.list{valuechanged_cb = function(self)
            funcSelect()
        end,
        sort = "YES", dropdown = "YES", editbox = "NO", expand = "YES", visibleitems = "5"}
      for i, v in ipairs(tblVals) do
            l[tostring(i)]=v
      end
    return l
end

这是可行的,但是有没有更好的方法呢?

我想先解决填充问题,然后再讨论值表的可选性。

环境是带有compat-5.3模块的Lua 5.1。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-14 20:58:06

如果它对任何人有帮助,我最后做的是(迎合索引和非索引列表):

代码语言:javascript
复制
    local function PopulateList(l, tblVals)
        local is_indexed = (rawget( tblVals, 1 ) ~= nil)
        if not is_indexed then
            local i=1
            for k, _ in pairs(tblVals) do
                l[tostring(i)]=k
                i=i+1
            end
        else
            for i, v in ipairs(tblVals) do
                l[tostring(i)]=v
            end 
        end
    end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54061729

复制
相关文章

相似问题

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