Module:Sandbox/DePiep/element
Appearance
local p = {}
local data1 = ''
local e2id
function eToId(e)
return e
end
function p.element(frame)
local args = frame.args -- arguments in #invoke
local first = args[1] or 'no value for first' -- first unnamed argument
local dummy = args['dummy'] or 'no value for dummy'
local eId = eToId(e)
local e = {}
-- Make a copy of the args table. The values will actually be present in
-- argsCopy, so the # operator will work on it. The # operator doesn't work
-- on the args table directly, because it doesn't actually contain any
-- values. (The values are found through the use of metatables.)
local argsCopy = {}
for k, v in pairs(args) do
argsCopy[k] = v
end
table.insert(e, '')
return '*Value of #args (I don\'t think this does anything useful): ' .. #args ..
'\n*Value of #argsCopy: ' .. #argsCopy ..
'\n*First unnamed argument: ' .. first ..
'\n*Dummy argument: ' .. dummy
end
function p.metatable()
-- This function shows how metatables work with the # operator.
-- The arguments table (frame.args) uses something similar to this, so
-- this example should explain why # doesn't work on it.
local ret = ''
-- At first, t1 is just a blank table.
local t1 = {}
ret = ret .. 't1 with no metatable:'
ret = ret .. '\n* First unnamed argument: ' .. (t1[1] or 'no value for first')
ret = ret .. '\n* Length: ' .. #t1
-- t2 contains the actual values we want.
local t2 = {'the first t2 value', 'the second t2 value'}
ret = ret .. '\n\n'
ret = ret .. 't2, which holds the arguments:'
ret = ret .. '\n* First unnamed argument: ' .. (t2[1] or 'no value for first')
ret = ret .. '\n* Length: ' .. #t2
-- Now we attatch a metatable to t1. We haven't given any instructions to
-- the metatable yet, so it won't do anything for now.
local metatable = {}
setmetatable(t1, metatable)
ret = ret .. '\n\n'
ret = ret .. 't1 with a blank metatable:'
ret = ret .. '\n* First unnamed argument: ' .. (t1[1] or 'no value for first')
ret = ret .. '\n* Length: ' .. #t1
-- And now we add an __index metamethod to the metatable. This example
-- tells Lua to look up values in t2 if the value in t1 is nil.
-- t1 still doesn't contain any actual values, so its length is still
-- reported as 0.
metatable.__index = t2
ret = ret .. '\n\n'
ret = ret .. 't1 with an __index metamethod set to t2:'
ret = ret .. '\n* First unnamed argument: ' .. (t1[1] or 'no value for first')
ret = ret .. '\n* Length: ' .. #t1
-- Now we write a new value to t1. This value is actually present in t1, so
-- Lua doesn't look up the value in t2, and it is picked up by the #
-- operator.
t1[1] = 'A new first value for t1'
ret = ret .. '\n\n'
ret = ret .. 't1 with an __index metamethod set to t2, and a value written to the first field:'
ret = ret .. '\n* First unnamed argument: ' .. (t1[1] or 'no value for first')
ret = ret .. '\n* Length: ' .. #t1
return ret
end
return p