WoW:Common Lua shortcuts: Difference between revisions

From AddOn Studio
Jump to navigation Jump to search
m (Move page script moved page Common Lua shortcuts to Common Lua shortcuts without leaving a redirect)
 
(One intermediate revision by one other user not shown)
Line 1: Line 1:
{{UIHowTo}}
{{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 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]]
[[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.