WoW:USERAPI setArgs
This page documents a <i>user-defined function</i> that you can copy and paste into your addon. Replace PREFIX with your addon or lib prefix to avoid conflicts between different versions of these functions.
The setArgs() and getArgs() remember and retreive arguments for callback functions in a more memory efficient way.
setArgs(myTable, "name", arg1, arg2, arg3,...)
arg1,arg2,arg3,... = getArgs(myTable, "name"[, extra, arguments, ...])
setArgs ParametersEdit
ArgumentsEdit
- (myTable, "name", list,of,arguments,...)
- myTable
- Table - where to store the arguments
- "name"
- String - prefix to give the arguments, if you are storing arguments for multiple callbacks, otherwise ""
- ...
- List of arguments to be stored
ReturnsEdit
- nothing
getArgs ParametersEdit
ArgumentsEdit
- (myTable, "name"[, ...])
- myTable
- Table - where to retreive the arguments from
- "name"
- String - prefix used in setArgs
- ...
- (optional) - extra arguments to use after the stored ones
ReturnsEdit
- All arguments stored by setArgs(), optionally followed by the extra arguments supplied to getArgs()
Example 1Edit
Just demonstrating how setArgs and getArgs actually work
function out(...) for i=1,select("#", ...) do print(i.."="..tostring(select(i,...))) end end tbl = {} setArgs(tbl, "myArgList", "a", nil, "3") out( getArgs(tbl, "myArgList", "extra", nil, "cheese") )
ResultEdit
1=a 2=nil 3=3 4=extra 5=nil 6=cheese
Example 2Edit
Demonstrating how callbacks could be implemented in a "library" / addon that wants to be able to accept callback registrations from other sources
"Library"Edit
local mytable = {} local function myUpdateHandler(this, delay) if mytable.callback then mytable.callback( getArgs(mytable, "arg", delay) ) end end function RegisterOnUpdateCallback(func, ...) mytable.callback = func setArgs(mytable, "arg", ...) end
(There obviously needs to be a frame created that calls myUpdateHandler via OnUpdate also, but that's out of scope for the example)
"User"Edit
function MyMod:OnUpdate(delay) print("OnUpdate fired after " delay " seconds"); end function MyMod:Initialize() SetOnUpdateCallback(MyMod.OnUpdate, self) end
CodeEdit
local getArgs do local numargs local function _get(t, str, i, ...) if i<=numargs then return t[format("%s%d", str, i)], _get(t, str, i+1, ...) end return ... end function getArgs(t, str, ...) numargs = t[str.."#" or 0] return _get(t,str,1, ...) end end local function setArgs(t, str, ...) local n = select("#", ...) for i=1,n do t[format("%s%d",str,i)]=select(i,...) end for i=n+1, (t[str.."#"] or 0) do t[format("%s%d",str,i)]=nil end t[str.."#"] = n end