WoW:USERAPI setArgs: Difference between revisions

From AddOn Studio
Jump to navigation Jump to search
(New page: Callback argument handling)
 
mNo edit summary
Line 1: Line 1:
#redirect [[Callback argument handling]]
{{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&lt;=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

Revision as of 21:25, 5 March 2016

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.

User defined 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