Alistaire
Alistaire

Reputation: 63

Lua sending a called function's name

Basically I want to know when function;

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

gets called, and send its name (specifically I want to send "n") to another function;

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

which then processes all possible requests.


I want to do this because button[n] is specified, and therefore the button[n]:onclick() gets triggered every time the button is clicked, but it doesn't seem right to write these function every time I want another buttonclick to be processed in the big allbuttons function;

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

(...)

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




I've tried something like;

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

but I guess I don't fully understand how to use debug.sethook ..

Upvotes: 2

Views: 647

Answers (1)

Oliver
Oliver

Reputation: 29591

Set button[n]:onclick to be the function you want (allbuttons), except that here there is one tricky bit, the value n. You likely know already that you could do

button[n].onclick = allbuttons

But if the event dispatcher calls onclick as button[n]:onclick() then allbuttons will always get button as first argument. If what you really want in allbuttons is to know the button[n] instance that was clicked, all you need to do is change the definition of allbuttons(n) to allbuttons(button) and change its code accordingly.

If you need n and it's not available any other way, you can create an anonymous closure with access to n as an upvalue (see http://www.lua.org/pil/6.1.html for details):

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

Or you could do it this way too:

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

The code is simpler but the index appears twice in the expression, a potential source of error.

Upvotes: 1

Related Questions