避免在Lua中将全局变量与特定的回调机制一起使用

时间:2018-08-19 16:13:47

标签: lua callback

我想使用Lua API,当事件发生时,它具有特定的回调函数,例如TCP包到达时。首先必须注册该功能,但要使用功能名称作为字符串,请参见下面的示例代码

function __init__()
    local dstport = 4681
    local dstIP = "192.168.1.42"
    -- register the callback function 
    register_tcp_handler('tcp_package_handler', dstIP, dstPort)
end

-- callback function
function tcp_package_handler(srcIP, srcPort, dstIP, dstPort, payload)
    -- check the payload, or reset watchdog
end

最好在被调用方提供的回调函数中包含其他变量,例如看门狗定时器或其他对象。

我能想到的最简单的方法是使超变量全局化,但这是我认为最不优雅的方法。如果我可以直接传递函数,闭包将很有帮助,但我不能。我必须使用函数名称作为字符串。

考虑到这种机制,是否有一种更优雅的方式将变量私有化为回调函数而不使它们全局化?

编辑:使用像这样的闭包

function closure_tcp_package_handler(srcIP, srcPort, dstIP, dstPort, payload, packagecounter, timerobject)
    function tcp_package_handler(srcIP, srcPort, dstIP, dstPort, payload)
        -- do some stuff, change packagecounter, timerobject
    end
    return 'tcp_package_handler'
end

并两次使用此功能进行注册,例如使用packagecounter1, timerobject1packagecounter2, timerobject2,将仅更改最后一对参数。

1 个答案:

答案 0 :(得分:1)

您正在处理回调基础结构。在这种情况下,您的代码不是调用处理程序的代码。因此,无法隐藏这些参数。如果您可以更改它们,那么其他人也可以访问提供处理程序的模块。

当然,这并不意味着它们必须是全球性的。您可以使它们成为表的成员。如果要确保它们仅获得某些参数,甚至可以提供设置函数来设置参数。

它的简单形式如下:

local handler_params = {}

function tcp_package_handler(srcIP, srcPort, dstIP, dstPort)
    -- check `handler_params.payload`
end

--Make `handler_params` available for outside modification

您如何做最后一部分完全取决于您。您可以将其设置为全局,但如果它在某个模块中的某个位置,则最好使其成为该模块表的成员。再说一次,如果您想控制谁可以戳它以及如何戳它,可以使用setter函数:

function tcp_handler_set_payload(payload)
  handler_params.payload = payload
end