WoW:Common Lua shortcuts: Difference between revisions

From AddOn Studio
Jump to navigation Jump to search
 
mNo edit summary
Line 9: Line 9:
  print(UnitExists("target") and "You have a target" or "You don't have a target")); -- As a trigraph
  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 oeprator is that if the ''true'' expression may return a false value, the false expression will be returned:
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]]

Revision as of 04:53, 13 March 2009

HOWTOs

This article covers several syntactic features of Lua that are commonly used in addon code.

Logical short-cut evaluation

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

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

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.