Lua 发送被调用函数的名称。

基本上我想知道当函数;

button[n]:onclick() -- 其中 n 可以是任何字符串值

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

function allbuttons(n) -- 其中 n 是来自 button[n]:onclick() 的 n

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

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

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..

点赞
用户869951
用户869951

button[n]:onclick 设为你想要的函数(allbuttons),但是这里有一个棘手的地方,值 n。你可能已经知道你可以这样做:

button[n].onclick = allbuttons

但是,如果事件分派程序调用 onclick 作为 button[n]:onclick(),那么 allbuttons 将始终获得 button 作为第一个参数。如果在 allbuttons 中真正想要的是知道所单击的 button[n] 实例,则只需要将 allbuttons(n) 的定义更改为 allbuttons(button),并相应更改其代码。

如果你需要值 n,而且没有其他方式可用,你可以创建一个具有访问 n 的上值的匿名闭包(有关详细信息,请参见 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)

代码更简单,但索引在表达式中出现两次,可能会导致错误。

2014-01-17 14:22:30