Lua userdata pass by reference - local functions in different files

我有两个 Lua 文件,分别为 _mydialog.lu_a 和 rangecontrol.lua 。mydialog.lua 中的代码如下所示:

local function mydialog()
    --省略
    local wb_responses=activeobj() -- wb_responses 指向当前 activeobj(),比如 Obj1
    UI.m_txt=sys.rangetextcontrol(UI.sbSizerInput:GetStaticBox() ,wb_responses) -- wb_responses 通过引用传递
    --选择事件发生
    --省略
    --如果单击复选框,则执行以下行
    print(wb_responses) -- 仍然打印 Obj1 而不是 Obj2
end
sys.tools.mydialog=mydialog

rangecontrol.lua 中的代码为:

local function rangetextcontrol(parent, wb_txtBox)

    local  m_txtBox=nil
    m_txtBox=wx.wxTextCtrl( parent, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxDefaultSize, 0 )

    local function GetRange()
        wb_txtBox=activeobj()
        local ws=activeobj():cur()
        local rng=ws:selection()
        if (rng==nil)  then return end
        m_txtBox:SetValue(rng:tostring()) -- 此处 wb_txtBox 正确地引用 Obj2
    end

    m_txtBox:Connect( wx.wxEVT_LEFT_DOWN, function(event)
        wb_txtBox=activeobj() -- 当前 activeobj() 更改为 Obj2
        local ws=wb_txtBox:cur()
        ws:connect(GetRange) -- 存在选择事件,调用 GetRange

        event:Skip()
    end)
    return m_txtBox
end
sys.rangetextcontrol=rangetextcontrol

简而言之,发生了什么:

1)启动一个对话框,其中有一个文本控件(可能有多个文本控件)

2)当用户从一个对象中选择时,文本框会被填充。

3)我的目标是追踪从哪个对象进行的选择。

我的困惑: 尽管我传递了一个 userdata 类型的 wb_responses,应该通过引用传递到跟踪选择的 rangetextcontrol 中,但似乎 wb_responses 永远不会改变,因为它始终打印 Obj1 的信息。因此,我认为它始终指向在 mydialog.lua 中初始化的第一个对象。我可能做错了什么?

点赞
用户2858170
用户2858170
本地函数 mydialog() 

- 省略部分代码

    local wb_responses = activeobj() --wb_responses 指向当前活动对象,比如 Obj1
    UI.m_txt=sys.rangetextcontrol(UI.sbSizerInput:GetStaticBox() ,wb_responses) --通过引用传递 wb_responses
    -- 选择事件发生
    print(wb_responses) --仍然打印 Obj1 而不是 Obj2
end

你在初始化 wb_responses 后立即打印它。它的值应该如何改变呢?在这两行代码之间不会有任何事件处理。

2016-12-09 10:27:28