This page documents a user-defined function that you can copy and paste into your addon. Replace <PREFIX> with your AddOn's prefix to avoid conflicts between different versions of these functions.
← User defined functions < setArgs
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 Parameters[]
Arguments[]
- (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
Returns[]
- nothing
getArgs Parameters[]
Arguments[]
- (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
Returns[]
- All arguments stored by setArgs(), optionally followed by the extra arguments supplied to getArgs()
Example 1[]
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") )
Result[]
1=a 2=nil 3=3 4=extra 5=nil 6=cheese
Example 2[]
Demonstrating how callbacks could be implemented in a "library" / addon that wants to be able to accept callback registrations from other sources
"Library"[]
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"[]
function MyMod:OnUpdate(delay)
print("OnUpdate fired after " delay " seconds");
end
function MyMod:Initialize()
SetOnUpdateCallback(MyMod.OnUpdate, self)
end
Code[]
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