38 ms·
In lua, the metatable is the killer feature that python doesn't have.
by meric 15y ago
In lua, the metatable is the killer feature that python doesn't have.
- gregholmberg 15y agoWhen my main language was C, I used to feel that dynamically mutating or self-modifying data structures were somewhere between black magic and heresy. I have found that being able to place arbitrary constraints on the way my programs store things in (seemingly simple) data structures has been very, very powerful.
- sshumaker 15y agometatables don't involve dynamically mutating / self-modifying data structures. They're more equivalent to javascript's prototype, except slightly more general-purpose. You can easily use them to build an OO system, among other things.
- gregholmberg 15y agoYes, I agree that Lua metatables / metamethods look and work a lot like JavaScript's prototype property. I should have been more specific when mentioning self-modifying data structures and Lua metatables in the same post. Consider: it is possible for a table to be its own metatable, and for that table to contain (pointers to) some functions that govern storing data in the table. For the non-Lua reader, these tied-to-an-event-on-a-table functions are called table-access metamethods [0], and they allow for some dangerous shenanigans. If these particular metamethods knew how to add to, rearrange, or delete from the set of callable functions already stored in the table, the subsequent layout and contents of the table could change in a non-deterministic way. Something that looks like a simple assignment/update (__newindex/__index, insert/update, or your favorite pair of terms) t[0] = "command phrase" x = t[0] could trigger wholesale reorganization of the table, including deletion or addition of new metamethods. [0] "Programming in Lua 1ed (Chapter 13. Metatables and Metamethods, 13.4 – Table-Access Metamethods)" http://www.lua.org/pil/13.4.html http://www.lua.org/pil/13.4.html edit: incomplete example
- hythloday 15y agoCould you explain what you can accomplish with Lua metatables that you can't do with python __eg__ methods? I've only seen them used as a way to implement operator overloading.
- corysama 15y agoRoll-your-own prototypical inheritance. I also vaguely recall rolling my own approximation to class inheritance long ago.
- jemfinch 15y agoYou can do that trivially with __*attr__ methods in Python. If you want something more structured, you can easily do it with a metaclass.
- sshumaker 15y ago__index and __newindex are the key ones - effectively equivalent to method_missing in Ruby. __index gets called if you try to read a non-existent key, and __newindex gets called if you try to write to a non-existing key. You can use these methods to implement inheritance, proxies, getters/setters, all sorts of stuff.
- hythloday 15y agoThis sounds very much like Python's __getattribute__ [0] method. Is there a difference I'm not understanding? [0] http://docs.python.org/reference/datamodel.html#object.__getattribute__ http://docs.python.org/reference/datamodel.html#object.__get...
- sshumaker 15y agoI'm not that familiar with Python, but can you use __getattribute__ to provide methods as well? Using __index is the way you typically implement inheritance in Lua.