Wowpedia

We have moved to Warcraft Wiki. Click here for information and the new URL.

READ MORE

Wowpedia
(Updated with new information - Added example function)
m (Cleanup)
Line 16: Line 16:
   
 
-- Print all of the function's arguments (those passed to the ellipsis (...) only) to the default chat frame.
 
-- Print all of the function's arguments (those passed to the ellipsis (...) only) to the default chat frame.
  +
local msg
 
for i = 1, select('#', ...) do
 
for i = 1, select('#', ...) do
DEFAULT_CHAT_FRAME:AddMessage(select(i, ...))
+
msg = select(i, ...)
  +
DEFAULT_CHAT_FRAME:AddMessage(msg)
 
end
 
end
   
Line 29: Line 31:
   
 
function MyAddon_Catenate(...)
 
function MyAddon_Catenate(...)
local t,n,i,v;
+
local t,v
 
t = {}
 
n=select("#",...);
+
for i = 1, select("#", ...) do
  +
v = select(i, ...)
t={};
 
 
tinsert(t, v)
for i=1,n do
 
 
end
v=select(i, ...); -- Have to save to a variable before adding to get each element separately
 
 
return t
tinsert(t,v);
 
end
 
return t;
 
 
end
 
end
   
Line 49: Line 49:
 
: <pre>select(-1, 1, 2, 3, 4, 5) -- returns 5</pre>
 
: <pre>select(-1, 1, 2, 3, 4, 5) -- returns 5</pre>
 
* A decimal index will be rounded to the nearest integer (1.1 rounds to 1, 1.9 rounds to 2).
 
* A decimal index will be rounded to the nearest integer (1.1 rounds to 1, 1.9 rounds to 2).
  +
* Passing a function that returns a list as a parameter to another function will pass each return as a parameter to the function as if you were manually passing each variable to that function, so ''tinsert(tab, select(1, ...))'', will have unpredictable results.
  +
<pre>-- these are identical
  +
-- number 1
  +
local msg, r, g, b, a, id = select(1, ...)
  +
DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b, a, id)
   
  +
-- number 2
== Disclaimer ==
 
  +
DEFAULT_CHAT_FRAME:AddMessage(select(1, ...))</pre>
* Tested using the command line. Lua v5.1.2. Not tested in the WoW environment.
 
   
 
{{LUA}}
 
{{LUA}}

Revision as of 06:01, 18 December 2008

Used to traverse a list. This function is usually used to capture the arguments passed to an ellipsis (...). The official usage of this function is to return a list (retN) starting from index to the end of the list (list).

local ret1, ret2, retN = select(index, list)

Arguments

Parameters

index
Any non-zero number or the string "#".
list
Usually an ellipsis (...).

Returns

retN
The number of items in the list or every value starting from index to the end of the list.

Examples

-- Common usage.
local num = select('#', ...) -- Returns the number of arguments in the ellipsis.
local arg = select(i, ...) -- Returns the value at index i.
-- Print all of the function's arguments (those passed to the ellipsis (...) only) to the default chat frame.
local msg
for i = 1, select('#', ...) do
    msg = select(i, ...)
    DEFAULT_CHAT_FRAME:AddMessage(msg)
end
local a, b, c = select(2, 'a', 'b', 'c')
-- a = 'b'
-- b = 'c'
-- c = nil

Catenation

select can be used to catenate a vararg list into an array. This is useful for returning info from GetBinding, which returns a vararg list of unknown size.

function MyAddon_Catenate(...)
    local t,v
    t = {}
    for i = 1, select("#", ...) do
        v = select(i, ...)
        tinsert(t, v)
    end
    return t
end

Notes

  • list can be value1, value2, value3, ... valueN; although, you will never see it used in that manner since you can just access value1 through valueN directly.
  • It is not recommended that you use this method on a table as you would have to pass the table to unpack() for every call to select (once plus the number of consecutive numeric indexes). For tables, use pairs() or ipairs().
  • Indexes beyond the number of list items will return nil.
select(6, 'see', 'dog', 'run') -- returns nil
  • An index of 0 will produce an "index out or range" error.
  • Negative values wrap to the end of the list.
select(-1, 1, 2, 3, 4, 5) -- returns 5
  • A decimal index will be rounded to the nearest integer (1.1 rounds to 1, 1.9 rounds to 2).
  • Passing a function that returns a list as a parameter to another function will pass each return as a parameter to the function as if you were manually passing each variable to that function, so tinsert(tab, select(1, ...)), will have unpredictable results.
-- these are identical
-- number 1
local msg, r, g, b, a, id = select(1, ...)
DEFAULT_CHAT_FRAME:AddMessage(msg, r, g, b, a, id)

-- number 2
DEFAULT_CHAT_FRAME:AddMessage(select(1, ...))

Template:LUA