Userdata: Difference between revisions

From Legacy Roblox Wiki
Jump to navigationJump to search
>GoldenUrg
fixed description; provided alternative example
>JulienDethurens
No edit summary
 
(8 intermediate revisions by 5 users not shown)
Line 1: Line 1:
A userdata is the type Lua uses for data structures in the underlying C program. There are no native Lua functions for handling those types, they must be handled via [[Metatables|metatable]]. All Roblox objects are userdata Lua type.  
==Userdata==
===What is a userdata?===
A {{type|userdata}} is the type Lua uses for data structures in the underlying C program. There aren't native Lua functions for handling those types, they must be handled via [[metatables]]. All Roblox objects and events are {{type|userdata}} Lua type.


== Advanced ==
===Using userdatas===
You can create a new userdata by passing true to the undocumented newproxy function. This userdata cannot be used for anything other than invoking functions via its metatable.  
You can create a new {{type|userdata}} with an empty metatable by passing true to the undocumented [[newproxy]] function. This {{type|userdata}} cannot be used for anything other than invoking functions via its metatable.  


<big><span style="color:#ff0000;">WARNING: newproxy is temporarily disabled due to maintenance on _G</span></big>
{{Example|<pre>
<pre>
local ud = newproxy(true) -- new userdata with an empty metatable
local NewUserData = newproxy(true) -- New userdata; Returns an empty metatable
getmetatable(ud).__index = {Foo = "Bar"} -- index metamethod
getmetatable(NewUserData).__index = {Name = "Foo", FooValue = "EPIC"} -- index MetaMethod
print(type(ud), ud.Foo)
print(type(NewUserData), NewUserData.Name, NewUserData.FooValue)
</pre>


In the output window, you should see
<pre>
userdata Foo EPIC
</pre>
An equivalent functionality can be achieved in pure Lua:
<pre>
function newproxy( src )
local obj = {}
local mt
if src == true then
  mt = {}
elseif src then
  mt = getmetatable( src )
end
setmetatable( obj, mt )
return obj
end
local NewUserData = newproxy(true) -- New userdata; Returns an empty metatable
getmetatable(NewUserData).__index = {Name = "Foo", FooValue = "EPIC"} -- index MetaMethod
print(type(NewUserData), NewUserData.Name, NewUserData.FooValue)
</pre>
Output:
Output:
<pre>
userdata: 0x631fc8 Bar
table Foo EPIC
</pre>}}
</pre>


[[Category:Data Types]]
[[Category:Data types]]

Latest revision as of 17:59, 7 April 2012

Userdata

What is a userdata?

A userdata is the type Lua uses for data structures in the underlying C program. There aren't native Lua functions for handling those types, they must be handled via metatables. All Roblox objects and events are userdata Lua type.

Using userdatas

You can create a new userdata with an empty metatable by passing true to the undocumented newproxy function. This userdata cannot be used for anything other than invoking functions via its metatable.

Example
local ud = newproxy(true) -- new userdata with an empty metatable
getmetatable(ud).__index = {Foo = "Bar"} -- index metamethod
print(type(ud), ud.Foo)

Output:
userdata: 0x631fc8	Bar