Lua发送一个被叫函数的名字

时间:2014-01-17 09:09:46

标签: lua agen-framework

基本上我想知道什么时候功能;

button[n]:onclick() --where n can be any string value

被调用,并将其名称(特别是我想发送“n”)发送给另一个函数;

function allbuttons(n) --where n is the n from button[n]:onclick()

然后处理所有可能的请求。

我想这样做是因为指定了button [n],因此每次单击按钮时都会触发按钮[n]:onclick(),但是每次我想要另一个按钮点击这些函数似乎都不正确在大按钮功能中处理;

function button['options']:onclick()
  allbuttons('options')
end
function button['quit']:onclick()
  allbuttons('quit')
end

(...)

function button[n]:onclick()
  allbuttons(n)
end




我尝试过类似的东西;

debug.sethook(allbuttons, 'c')
function allbuttons()
  n = debug.getinfo(2).name
end

但我想我还不完全了解如何使用debug.sethook ..

1 个答案:

答案 0 :(得分:1)

button[n]:onclick设置为您想要的功能(全部按钮),除了这里有一个棘手的位,值n。你可能已经知道你可以做到了

button[n].onclick = allbuttons

但是,如果事件调度程序将onclick调用为button[n]:onclick(),则allbuttons将始终将按钮作为第一个参数。如果您在allbuttons中真正想要知道的是button[n]被点击的实例,那么您需要做的就是将allbuttons(n)的定义更改为allbuttons(button)并更改其代码因此。

如果你需要n并且它没有任何其他方式可用,你可以创建一个匿名闭包,可以访问n作为upvalue(详见http://www.lua.org/pil/6.1.html):

function sendClickToCommon(button, n)
    button[n].onclick = function (self) 
                            allbuttons(n)
                        end
end
sendClickToCommon(button, 1)
sendClickToCommon(button, 2)
sendClickToCommon(button, 3)

或者你也可以这样做:

function getAllbuttonsN(n)
    return function (self) 
               allbuttons(n)
           end
end
button[1].onclick = getAllbuttonsN(1)

代码更简单但索引在表达式中出现两次,这是潜在的错误来源。