WoWWiki

This wiki contains inaccurate and out-of-date information. Please head over to https://wowpedia.fandom.com for more accurate and up-to-date game information.

READ MORE

WoWWiki
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