WoW:Common Lua shortcuts: Difference between revisions
(Merge Tricks with Lua Doing Tricks Without Lua Method Notation Doing Tricks With Lua Method Notation) |
m (Move page script moved page Common Lua shortcuts to Common Lua shortcuts without leaving a redirect) |
||
(3 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
{{ | {{wow/uihowto}} | ||
This article covers several syntactic features of Lua that are commonly used in addon code. | This article covers several syntactic features of Lua that are commonly used in addon code. | ||
Line 7: | Line 7: | ||
For instance: | For instance: | ||
MySVTable = MySVTable or {}; | MySVTable = MySVTable or {}; | ||
print(UnitExists("target") and "You have a target" or "You don't have a target" | print(UnitExists("target") and "You have a target" or "You don't have a target"); -- As a trigraph | ||
A notable limitation of using short-cut evaluation as a trigraph | A notable limitation of using short-cut evaluation as a trigraph operator is that if the ''true'' expression may return a false value, the false expression will be returned: | ||
function isFrameShown(frame, checkParentFrames) | function isFrameShown(frame, checkParentFrames) | ||
-- The expression below returns the wrong value if frame's parent is hidden. | -- The expression below returns the wrong value if frame's parent is hidden. | ||
Line 36: | Line 36: | ||
The [[API getglobal|getglobal]]("name") function enables similar behavior, but at a marginally higher cost. | The [[API getglobal|getglobal]]("name") function enables similar behavior, but at a marginally higher cost. | ||
[[Category:Interface customization]] |
Latest revision as of 04:47, 15 August 2023
← HOWTOs
This article covers several syntactic features of Lua that are commonly used in addon code.
Logical short-cut evaluation[edit]
When evaluating the results of boolean operators and and or, Lua only evaluates the right-hand operand if necessary. This makes it possible to provide default values to nil or false expressions, or implement something resembling a trigraph operator.
For instance:
MySVTable = MySVTable or {}; print(UnitExists("target") and "You have a target" or "You don't have a target"); -- As a trigraph
A notable limitation of using short-cut evaluation as a trigraph operator is that if the true expression may return a false value, the false expression will be returned:
function isFrameShown(frame, checkParentFrames) -- The expression below returns the wrong value if frame's parent is hidden. return checkParentFrames and frame:IsVisible() or frame:IsShown(); end
This occurs because nothing prevents the evaluation of the or operator as its left-hand operand is false/nil.
Colon syntax for defining methods[edit]
The colon syntax is used for defining methods -- functions that have an implicit first parameter self. The following function definitions are equivalent:
t = {}; function t:foo(bar) end function t.foo(self, bar) end
When you call a function using the colon syntax, you implicitly supply the table left of the colon as the first argument to the function. The following two function calls are equivalent:
t:foo("baz"); t.foo(t, "baz");
This notation is frequently used to emulate something resembling objects.
The global environment table[edit]
The global environment table _G
is defined in most function environments. You can look up global variables by using their names as a key in this table. For example:
-- Suppose MyBar1, MyBar2, MyBar3 are global variables (Frames created in XML, for example) for i=1, 3 do _G["MyBar" .. i]:Show(); end
The getglobal("name") function enables similar behavior, but at a marginally higher cost.