WoW:USERAPI setArgs: Difference between revisions
(New page: Callback argument handling) |
m (Move page script moved page USERAPI setArgs to USERAPI setArgs without leaving a redirect) |
||
| (One intermediate revision by one other user not shown) | |||
| Line 1: | Line 1: | ||
# | {{userfunc}} <!-- Leave this line in! --> | ||
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 | |||
Latest revision as of 04:49, 15 August 2023
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 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